new不会隐藏继承的属性

时间:2012-10-20 20:46:46

标签: c# wpf xaml user-controls contentproperty

  

可能重复:
  C# keyword usage virtual+override vs. new

我正试图通过以下方式隐藏我的UserControl内容属性:

public partial class Tile : UserControl
{
    public new object Content
    {
        get { ... }
        set { ... }
    }
}

但是当我设置我的UserControl的内容时它没有做任何事情(如果我设置一个断点,它永远不会到达):

<my:Tile Content="The content"/>

<my:Tile>The content</my:Tile>

为什么呢?我该如何解决这个问题?

2 个答案:

答案 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.
}