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.
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}" />