覆盖wpf窗口中的超类方法

时间:2011-12-07 10:22:40

标签: wpf inheritance window

我想制作一个定制的窗口底座。所以我创建了一个继承自Window的自定义窗口。

例如:

public class MyWindowBase : Window
{

...
...

}

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

例如:

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

它适用于我之前的工作。

但是,在处理WPF窗口时,它不起作用。

我试图覆盖超类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的方法和属性?

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

非常感谢!

1 个答案:

答案 0 :(得分:0)

如果您只想设置值,则可以使用

进行设置
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);
}