0

に設定されたSecondaryWindowを動的に作成しました。したがって、そのコンテンツをオーバーライドしてDragMove-ableに設定したいと思います。WindowStyleNoneOnMouseLeftButtonDown

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 に答える