页中的依赖项属性

本文关键字:属性 依赖 | 更新日期: 2023-09-27 18:07:31

我想在我的Window类中定义一个dependencyproperty,就像下面的代码一样。

namespace dgCommon
{
    //MenuPage is a Page.
    public partial class MenuPage : IFrameInterop
    {
        public Style MenuIconStyle { get { return (Style)GetValue(MenuIconStyleProperty); } set { SetValue(MenuIconStyleProperty, value); } }
        public static readonly DependencyProperty MenuIconStyleProperty = DependencyProperty.Register("MenuIconStyle", typeof(Style), typeof(MenuPage), new UIPropertyMetadata(null));
    ...

在自定义控件中,此代码启用依赖项属性。但是在一个页面中,遵循XAML不能编译。

<Page x:Class="dgCommon.MenuPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:dgCommon="clr-namespace:dgCommon" 
      <!--following line is problem.-->
      MenuIconStyle="{StaticResource MenuButtonStyle}"
      x:Name="pageMenu">
...

原因是什么?

页中的依赖项属性

你不能使用在声明它的控件/窗口/页面的XAML中分配依赖属性。如果您想设置其默认值,请在代码后面进行设置。

这个问题在这里已经有了答案:在WPF/Silverlight页面中设置自定义属性
这个问题的原因也在链接中解释了。

你有几个选项来分配你的自定义依赖属性在Xaml

选项1 。为Page创建一个基类,在其中添加DP

MenuPage.xaml

<dgCommon:MenuPageBase x:Class="dgCommon.MenuPage" 
                       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                       xmlns:dgCommon="clr-namespace:dgCommon"
                       MenuIconStyle="{StaticResource MenuButtonStyle}">
    <!--...-->
</dgCommon:MenuPageBase>

MenuPage.xaml.cs

public partial class MenuPage : MenuPageBase
{
    // ...
}

MenuPageBase.cs

public class MenuPageBase : Page
{
    public static readonly DependencyProperty MenuIconStyleProperty =
        DependencyProperty.Register("MenuIconStyle",
                                    typeof(Style),
                                    typeof(MenuPage),
                                    new UIPropertyMetadata(null));
    public Style MenuIconStyle
    {
        get { return (Style)GetValue(MenuIconStyleProperty); }
        set { SetValue(MenuIconStyleProperty, value); }
    }
}

选项2。为MenuIconStyle实现静态get和set方法

MenuPage。xaml

<Page x:Class="dgCommon.MenuPage" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:dgCommon="clr-namespace:dgCommon"
      dgCommon.MenuPage.MenuIconStyle="{StaticResource MenuButtonStyle}">

MenuPage.xaml.cs

public partial class MenuPage : Page
{
    public static readonly DependencyProperty MenuIconStyleProperty =
        DependencyProperty.Register("MenuIconStyle",
                                    typeof(Style),
                                    typeof(MenuPage),
                                    new UIPropertyMetadata(null));
    public Style MenuIconStyle
    {
        get { return (Style)GetValue(MenuIconStyleProperty); }
        set { SetValue(MenuIconStyleProperty, value); }
    }
    public static void SetMenuIconStyle(Page element, Style value)
    {
        element.SetValue(MenuIconStyleProperty, value);
    }
    public static Style GetMenuIconStyle(Page element)
    {
        return (Style)element.GetValue(MenuIconStyleProperty);
    }
    // ...
}
3

选项。像其他人指出的那样使用附加属性

正如Thomas所说,要在窗口的代码隐藏中为DP提供默认值,请替换

new UIPropertyMetadata(null)new UIPropertyMetadata(DEFAULT_VALUE_HERE)

也就是说,如果你不在视图中引用它,那么DP是毫无用处的,你可以在xaml中访问这个DP,首先给你的控件一个名字:

<Page x:Class="dgCommon.MenuPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:dgCommon="clr-namespace:dgCommon" 
      x:Name="pageMenu" />

然后像这样调用DP:

<Page x:Class="dgCommon.MenuPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:dgCommon="clr-namespace:dgCommon" 
      x:Name="pageMenu" Style="{Binding MenuIconStyle, ElementName=pageMenu}" />

如果你真的想在窗口上有一个名为MenuIconStyle的属性,你需要查看附加属性