在UIElement初始化语句中覆盖事件

时间:2013-05-13 02:57:17

标签: c# wpf mouseevent uielement

我动态创建了一个 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();
        }
    };
}

1 个答案:

答案 0 :(得分:1)

您的问题可以更普遍地被问为“如何在对象初始值设定项中为事件添加处理程序?”。 '对象初始值设定项'指的是这样的语法:

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();
    }
};

我不推荐它,因为它为不熟悉您的代码的人增加了混乱,除了使用对象初始化程序的便利之外,可能没有充分的理由这样做。我建议初始化对象并在初始化器中设置属性,但是要订阅它所期望的事件,例如在父窗口的构造函数中。