0

我动态创建了一个具有WindowStyle设置为None. 因此,我想通过覆盖其内容将其设置为DragMove-ableOnMouseLeftButtonDown

我不知道如何在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();
        }
    };
}
4

1 回答 1

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

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

于 2013-05-13T07:12:59.683 回答