我正试图通过以下方式隐藏我的UserControl
内容属性:
public partial class Tile : UserControl
{
public new object Content
{
get { ... }
set { ... }
}
}
但是当我设置我的UserControl的内容时它没有做任何事情(如果我设置一个断点,它永远不会到达):
<my:Tile Content="The content"/>
或
<my:Tile>The content</my:Tile>
为什么呢?我该如何解决这个问题?
答案 0 :(得分:1)
问题是你没有隐藏实际的DependencyProperty,只有WPF可能会或可能不会总是用来设置DP值的get / set访问器。 WPF具有直接调用DependencyObject.GetValue / SetValue的优化。
在您的对象上创建一个名为“Content”的依赖项属性,然后新建get / set访问器,并且您正在做的事情应该有效。
public static readonly new DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(object), typeof(Tile));
public new object Content
{
get { return this.GetValue(ContentProperty); }
set { this.SetValue(ContentProperty, value); }
}
我不确定你为什么要这样做,而不是仅仅使用已经存在的内容属性。在我看来,你在这里与框架作斗争,并且有一种更简单的方法来做你想做的事。
答案 1 :(得分:0)
如果您想将自己的功能插入Content
媒体资源,那么您可能正在寻找DependencyProperty.OverrideMetadata()
。这样,您可以在派生类中添加自己的属性更改处理程序。它看起来像这样:
static Tile()
{
ContentProperty.OverrideMetadata(typeof(Tile), new PropertyMetadata(null, OnContentChanged));
}
private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Your logic goes here.
}
修改强>
刚看了一眼,WPF已经为您解决了这个问题。您只需覆盖OnContentChanged
:
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
// Your logic goes here.
}