Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重写UIElement初始化语句中的事件_C#_Wpf_Mouseevent_Uielement - Fatal编程技术网

C# 重写UIElement初始化语句中的事件

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

我动态创建了一个secondary窗口,该窗口的
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();
    }
};
不过我不推荐这样做,因为它会给不熟悉您的代码的人带来困惑,而且除了方便您使用对象初始值设定项之外,可能没有很好的理由这样做。我建议初始化对象并在初始值设定项中设置属性,但在预期的位置订阅它的事件,例如在父窗口的构造函数中