C# 重写UIElement初始化语句中的事件
我动态创建了一个secondary窗口,该窗口的C# 重写UIElement初始化语句中的事件,c#,wpf,mouseevent,uielement,C#,Wpf,Mouseevent,Uielement,我动态创建了一个secondary窗口,该窗口的WindowStyle设置为None。因此,我想通过覆盖其OnMouseLeftButtonDown将其内容设置为DragMove-able 我不知道如何在SecondaryWindow初始化语句中包含覆盖函数 public class MainWindow { Window SecondaryWindow = new Window { WindowStyle = System.Windows.WindowStyle
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
};
Window SecondaryWindow = new Window
{
WindowStyle = System.Windows.WindowStyle.None,
Content = new myUserControl(),
Topmost = true,
MouseLeftButtonDownSubscriber = (object sender, MouseButtonEventArgs e) =>
{
base.OnMouseLeftButtonDown(e);
base.DragMove();
}
};
为了确保您不会误解某些内容,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; }
}
}
不,您可以这样初始化对象:
Foo newFow = new Foo
{
Foo.Property = someValue
};
Window SecondaryWindow = new Window
{
WindowStyle = System.Windows.WindowStyle.None,
Content = new myUserControl(),
Topmost = true,
MouseLeftButtonDownSubscriber = (object sender, MouseButtonEventArgs e) =>
{
base.OnMouseLeftButtonDown(e);
base.DragMove();
}
};
不过我不推荐这样做,因为它会给不熟悉您的代码的人带来困惑,而且除了方便您使用对象初始值设定项之外,可能没有很好的理由这样做。我建议初始化对象并在初始值设定项中设置属性,但在预期的位置订阅它的事件,例如在父窗口的构造函数中