1

可能重复:
C# 关键字使用 virtual+override 与 new

我正在尝试UserControl通过以下方式隐藏我的 Content 属性:

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

但是当我设置我的 UserControl 的内容时,它什么也不做(如果我设置了断点,它永远不会到达):

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

或者

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

为什么?我怎么解决这个问题?

4

2 回答 2

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); }
}

我不确定您为什么要这样做,而不仅仅是使用已经存在的 content 属性。在我看来,您在这里与框架作斗争,并且有一种更简单的方法可以做您想做的事情。

于 2012-10-20T21:00:51.890 回答
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.
}
于 2012-10-20T21:03:54.663 回答