Search code examples
c#wpf.net-4.0resourcedictionary

Setting WindowStartupLocation from ResourceDictionary throws XamlParseException


When I attempt to set the WindowStartupLocation property through a Setter within a ResourceDictionary, I get a XamlParseException:

'Set property 'System.Windows.Setter.Property' threw an exception.' Line number 'x' and line position 'y'.

The inner exception is an ArgumentNullException:

Value cannot be null. Parameter name: property.

My style within the resource dictionary is:

<Style TargetType="Window" x:Key="WindowStyle">
    <Setter Property="SizeToContent" Value="WidthAndHeight" />
    <Setter Property="ResizeMode" Value="CanMinimize" />
    <Setter Property="WindowStartupLocation" Value="CenterOwner" />
</Style>

The issue is not with the use of the ResourceDictionary, since when I remove the WindowStartupLocation, the other two properties (SizeToContent and ResizeMode) are set as expected on windows which reference the style:

<Window x:Class="WpfApplication1.MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Style="{DynamicResource WindowStyle}">
    <Window.Resources>
        <ResourceDictionary Source="MyResourceDictionary.xaml" />
    </Window.Resources>
</Window>

Has anyone encountered this? Is it a bug/limitation of WPF?

P.S. I know that this question is similar to Window Startup Location from resource dictionary, but not enough information was provided in the other question which subsequently remained unsolved.


Solution

  • The problem is that WindowStartupLocation is not a DependencyProperty so you can't set it in the style setter. Looking in ILSpy the Setter calls

    CheckValidProperty(DependencyProperty property)
    

    and throws a NullArgumentException.

    As WindowStartupLocation is just a CLR property, it can't be set in this way.

    However, you can still use a ResourceDictionary:

    <Application.Resources>
        <ResourceDictionary>
            <Style x:Key="WindowStyle" TargetType="Window">
                <Setter Property="SizeToContent" Value="WidthAndHeight" />
                <Setter Property="ResizeMode" Value="CanMinimize" />
            </Style>
            <WindowStartupLocation x:Key="WSL">CenterOwner</WindowStartupLocation>
        </ResourceDictionary>
    </Application.Resources>
    
    <Window x:Class="WpfApplication7.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"            
            WindowStartupLocation="{StaticResource WSL}"
            Style="{StaticResource WindowStyle}" />