在元素初始化语句中重写事件

本文关键字:重写 事件 语句 元素 初始化 | 更新日期: 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();
    }
};
但我不建议使用

,因为它会给不熟悉代码的人带来困惑,而且除了使用对象初始化器的便利之外,这样做可能没有很好的理由。我建议在初始化器中初始化对象并设置属性,但在期望的地方订阅它的事件,例如在父窗口的构造函数中。