我动态创建了一个 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();
}
};
}
答案 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();
}
};
我不推荐它,因为它为不熟悉您的代码的人增加了混乱,除了使用对象初始化程序的便利之外,可能没有充分的理由这样做。我建议初始化对象并在初始化器中设置属性,但是要订阅它所期望的事件,例如在父窗口的构造函数中。