我想制作一个定制的窗口底座。所以我创建了一个继承自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的方法和属性?
实际上,我想覆盖基本背景,使其永远为空或透明,但更改的值将应用于我自己的自定义背景。
非常感谢!
答案 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);
}