2

c# WPF routedevent に問題があります。このコードは正常に動作します:

        MyLabel myLabel = new MyLabel();//MyOwn component
        myLabel.Oma += new RoutedEventHandler(myLabel_Click);
        GameArea.Children.Add(mylabel);//GameArea is UniformGrid

しかし、myLabel を ToggleButton のコンテンツに配置すると、routedeventhandler(myLabel_Click) は Oma イベントをキャッチしません (デバッグしました):

        MyLabel myLabel = new MyLabel();//MyOwn component
        myLabel.Oma += new RoutedEventHandler(myLabel_Click);
        System.Windows.Controls.Primitives.ToggleButton box = new System.Windows.Controls.Primitives.ToggleButton();
        box.Content = myLabel;
        GameArea.Children.Add(box);//GameArea is UniformGrid

では、なぜ ToggleButton が routedevent をブロックするのでしょうか?

編集: コードは正常に動作しますが、myLabel を ToggleButton のコンテンツに入れると問題が発生します。
MyLabel の OmaEvent は次のようになります。

public static readonly RoutedEvent OmaEvent =
EventManager.RegisterRoutedEvent("Oma", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(MyLabel));

    public event RoutedEventHandler Oma
    {
        add { AddHandler(OmaEvent, value); }
        remove { RemoveHandler(OmaEvent, value); }
    }

    protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        base.OnMouseDown(e);
        CaptureMouse();
    }

    protected override void OnMouseUp(MouseButtonEventArgs e)
    {
        base.OnMouseUp(e);
        if (IsMouseCaptured)
        {
            ReleaseMouseCapture();
            if (IsMouseOver)
                RaiseEvent(new RoutedEventArgs(OmaEvent, this));
        }

    }

ToggleButton 内に配置すると、OmaEvent が発生することはありません。ToggleButton 内に配置しないと、機能します。

4

2 に答える 2

0

カスタム イベントの RoutingStrategy が、実行しよOmaうとしているものと一致しない可能性があるようです。

Omaイベントが に設定された RoutedEventDirectであり、MyLabelクラスがタイプの場合UIElement、次のようなことができるはずです。

GameArea.Children.Add(box);//GameArea is UniformGrid
GameArea.AddHandler(Oma, new RoutedEventHandler(myLabel_Click));
于 2014-12-09T22:04:46.783 に答える
0

親がそのメソッドでマウス キャプチャを盗み、メソッドのに呼び出されるOmaため、イベントは発生しません。にマウス キャプチャがある限り、他の要素はマウス イベントを受信しないため、ラベルはイベントを受信せず、メソッドは呼び出されません。ToggleButtonButtonBase.OnMouseLeftButtonDownOnMouseDownToggleButtonMouseUpOnMouseUp

メソッドで設定e.Handled = true;してOnMouseDown、イベントが にバブリングしないようにしToggleButtonます。これにより、フォーカスが盗まれるのを防ぐことができますが、ボタンMyLabel内をクリックしたときにボタンが正常に機能することもできなくなります。このシナリオでどのような動作が必要かは不明です。

于 2014-12-09T22:31:46.587 に答える