c# - 从 ResourceDictionary 设置 WindowStartupLocation 会引发 XamlParseException

标签 c# wpf .net-4.0 resourcedictionary

当我尝试通过 ResourceDictionary 中的 Setter 设置 WindowStartupLocation 属性时,我得到一个 XamlParseException :

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

内部异常是一个ArgumentNullException:

Value cannot be null. Parameter name: property.

我在资源字典中的风格是:

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

问题不在于使用 ResourceDictionary,因为当我删除 WindowStartupLocation 时,其他两个属性(SizeToContentResizeMode) 在引用样式的窗口上按预期设置:

<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>

有人遇到过吗?这是 WPF 的错误/限制吗?

附言我知道这个问题类似于 Window Startup Location from resource dictionary , 但在另一个问题中没有提供足够的信息,随后仍未解决。

最佳答案

问题是 WindowStartupLocation 不是 DependencyProperty,因此您不能在样式 setter 中设置它。在 ILSpy 中查看 Setter 调用

CheckValidProperty(DependencyProperty property)

并抛出 NullArgumentException。

由于 WindowStartupLocation 只是一个 CLR 属性,不能以这种方式设置。

但是,您仍然可以使用 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}" />

关于c# - 从 ResourceDictionary 设置 WindowStartupLocation 会引发 XamlParseException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10596515/

相关文章:

c# - Prism 程序集引用失败 : System. Windows.Interactivity

.net - WPF MVVM设置控制焦点

wpf - 如何将 DataGrid 中 CheckBox 的可见性绑定(bind)到该行的 DataContext?

.net - 为什么 System.Environment.MachineName 值大写?

c# - BigInteger 是否不可变?

c# - 使用后处理 ObjectContext(每个请求)

c# - 观察集合中项目的 PropertyChanged

c# - 启动保持事件状态的非阻塞线程的可能方法

c# - 如何为 appsettings.json 复杂数组使用选项模式

c# - 将值从 aspx 传递到 javascript