页中的依赖项属性
本文关键字:属性 依赖 | 更新日期: 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的属性,你需要查看附加属性