在元素初始化语句中重写事件
本文关键字:重写 事件 语句 元素 初始化 | 更新日期: 2023-09-27 18:13:26
我动态地创建了一个SecondaryWindow,它将WindowStyle
设置为None
。因此,我想通过重写其OnMouseLeftButtonDown
将其内容设置为DragMove-able。
我不知道如何在SecondaryWindow初始化语句
中包含重写函数public class MainWindow
{
Window SecondaryWindow = new Window
{
WindowStyle = System.Windows.WindowStyle.None,
Content = new myUserControl(),
Topmost = true,
// My failed attempt
base.OnMouseLeftButtonDown += (object sender, MouseButtonEventArgs e) =>
{
base.OnMouseLeftButtonDown(e);
base.DragMove();
}
};
}
您的问题可以更普遍地问为'如何在对象初始化器中添加事件处理程序?'。'对象初始化器'指的是这样的语法:
Foo newFow = new Foo
{
Foo.Property = someValue
};
只是为了确保您不会误解某些内容,OnMouseLeftButtonDown += smth
不会覆盖事件,而是为事件添加事件处理程序。
话虽如此,你不能。c#不支持在对象初始化器中注册事件处理程序:
// Not possible
Foo newFoo = new Foo
{
Event += someHandler
};
c#也不允许你设置事件:
// Not possible
Foo newFoo = new Foo
{
Event = someDelegate
};
但是,您可以绕过此限制,通过将类SecondaryWindow的事件包装在属性中:
public class SecondaryWindow : Window
{
public MouseButtonEventHandler MouseLeftButtonDownSubscriber
{
set { MouseLeftButtonDown += value; }
}
}
不,你可以这样初始化你的对象:
Window SecondaryWindow = new Window
{
WindowStyle = System.Windows.WindowStyle.None,
Content = new myUserControl(),
Topmost = true,
MouseLeftButtonDownSubscriber = (object sender, MouseButtonEventArgs e) =>
{
base.OnMouseLeftButtonDown(e);
base.DragMove();
}
};
但我不建议使用,因为它会给不熟悉代码的人带来困惑,而且除了使用对象初始化器的便利之外,这样做可能没有很好的理由。我建议在初始化器中初始化对象并设置属性,但在期望的地方订阅它的事件,例如在父窗口的构造函数中。