【问题标题】:override the super class methods in wpf Window覆盖 wpf Window 中的超类方法
【发布时间】:2011-12-07 10:22:39
【问题描述】:

我想做一个定制的窗台。所以我做了一个继承自Window的自定义窗口。

例如:

public class MyWindowBase : Window
{

...
...

}

我想为自己的目的覆盖超类 Window 的不同画笔。 根据我以前的经验,要覆盖超类中没有抽象或虚拟的方法/属性需要关键字“new”。

例如:

public new void DoSomething() { ........ base.DoSomething() ....... }
public new string SomeText { get { ... } set {......} }

它在我以前的工作中有效。

但是,在这个处理 WPF Window 的时候,它不起作用。

我尝试覆盖超类Window的不同Brushes如下:

public new Brush BorderBrush  
{
  get { ... }
  set { myBorderBrush = value; base.BorderBrush = null }
}

public new Brush Background 
{
  get { ... }
  set { myBackground = value; base.Backgound = null; }
}

.....
.....
.....

我尝试在MyWindowBase中改变上述Brushes的值,它只是改变超类Window的值,并没有改变myBorderBrush和myBackground的值。

那么,如何覆盖超类Window的方法和属性呢?

实际上,我想覆盖基础背景,使其永远为空或透明,但更改后的值将应用于我自己的自定义背景。

非常感谢!

【问题讨论】:

  • 尝试使用“覆盖”而不是“新”。

标签: wpf inheritance window


【解决方案1】:

如果你只想设置值,那么你可以设置它使用

this.BorderBrush = Brushes.Blue;
this.Background = Brushes.Red;

如果您希望覆盖属性元数据(例如默认值、属性更改逻辑或验证),您可以使用OverrideMetadata

Window.BackgroundProperty.OverrideMetadata(
    typeof(MyWindowBase), myPropertyMetadata);

如果你只是想在 Changed 上添加一些逻辑,你可以使用DependencyPropertyDescriptor

var dpd = DependencyPropertyDescriptor.FromProperty(
    Window.BackgroundProperty, typeof(Window));
dpd.AddValueChanged(this.Value, new EventHandler(BackgroundChanged));

private void BackgroundChanged(object sender, EventArgs e)
{
    //do the code here
}

如果您希望覆盖一个方法,而不是一个属性,那么您可以使用 override 关键字

protected override void OnClosed(EventArgs e)
{
    base.OnClosed(e);
}

【讨论】:

  • DependencyPropertyDescriptor 中的“this.Value”是什么?
  • 我都尝试了属性覆盖,它不起作用。实际上,我想覆盖基本背景,使其永远为空或透明,但更改后的值将应用于我自己的自定义背景。
猜你喜欢
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
相关资源
最近更新 更多