在xaml中设置自定义窗口属性

时间:2011-11-01 14:39:47

标签: wpf window dependency-properties

我有以下代码:

public partial class NewWindow: Window
{
    public static readonly DependencyProperty PropNameProperty =
        DependencyProperty.Register(
                    "PropName",
                    typeof(int),
                    typeof(NewWindow),
                    null);

    public int PropName
    {
        get
        {
            return (int)GetValue(PropNameDependencyProperty);
        }
        set
        {
            SetValue(PropNameDependencyProperty, value);
        }
    }

现在,当我尝试使用我的新属性时,我无法编译:

<Window x:Class="AppName.NewWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:my="clr-namespace:AppName"
    Title="NewWindow" Height="300" Width="300"
    PropName="5"                          <-"property does not exist" error here
    >

我可能只是误解了一些东西,但我不确定是什么。

1 个答案:

答案 0 :(得分:4)

据我了解,它无法找到属性的原因是因为它在Window类中查找它,而不是在NewWindow类中查找它。为什么?因为XAML标记名称是Window,而不是NewWindow。

我尝试将标记更改为NewWindow,但实际上并不能这样做,因为您的XAML和后面的代码正在合作定义NewWindow类,而您无法根据自身定义类。这就是为什么顶级XAML元素总是父类,这就提出了一个解决方案:在一个继承自Window的新类中定义属性(为了参数调用它,ParentWindow),然后从中派生NewWindow,所以你得到像

这样的东西
<local:ParentWindow x:Class="TestApp.NewWindow"
    PropName="5"
    xmlns:local="clr-namespace:TestApp"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    ...
</local:ParentWindow>

我很欣赏这不一定是一个非常优雅的解决方案。