【问题标题】:new does not hide an inherited property [duplicate]new 不隐藏继承的属性[重复]
【发布时间】:2012-10-20 20:46:45
【问题描述】:

可能重复:
C# keyword usage virtual+override vs. 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>

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

【问题讨论】:

  • “它不会改变任何东西”是什么意思?
  • @KirkWoll 如果我设置断点,它永远不会到达......
  • @ErikPhilips Content 属性不是虚拟的...你知道 wpf 吗?
  • @Erik WPF 没有使用他的类作为 UserControl 类型,所以你错了。它使用DependencyObject.GetValue/SetValue,所以问题是他没有隐藏依赖属性。
  • 这不是重复的,因为 wpf 引入了 DependencyProperty 并且答案并不是关于 new 关键字。

标签: c# wpf xaml user-controls contentproperty


【解决方案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 属性。在我看来,您在这里与框架作斗争,并且有一种更简单的方法可以做您想做的事情。

【讨论】:

  • 不用担心我要做什么谢谢。你能给我看一段代码吗?
  • 正如下面的答案所示,有更好的方法来使用现有的内容属性。但如果你真的想隐藏基本属性,我会更新答案。
  • 鉴于您要求我向您展示一些注册依赖属性的代码,这实际上是 WPF 的基础知识,我猜您是 WPF 的新手,我认为您应该重新考虑隐藏您的意图,因为我们可能会建议一种更好的方法。
【解决方案2】:

如果您想将自己的功能插入到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-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多