15

イベントを使用するMouseUpと、マウスの右クリックでイベントを発生させることができます。しかしMouseLeftButtonUp、どちらのクリックでも発砲しません!

<Button MouseLeftButtonUp="btnNewConfig_MouseUp"  Name="btnNewConfig">
    <StackPanel Orientation="Horizontal">
        <Image Source="Icons\new.ico" Height="24" Width="24" Margin="5"/>
        <TextBlock VerticalAlignment="Center">New</TextBlock>
    </StackPanel>
</Button>

私はこれがおそらく単純なものであることを知っています。助けてくれてありがとう!

4

3 に答える 3

30

実際にはイベントとイベントの組み合わせであるButtonため、コントロールがそのイベントを使い果たしているように見えます。Button.ClickLeftButtonDownLeftButtonUp

PreviewMouseLeftButtonUpただし、のButton代わりにトンネルイベントをサブスクライブできますLeftButtonUp

于 2008-11-25T18:01:21.960 に答える
5

バブルイベントの代わりにトンネル化されたイベントにサブスクライブすると、後で説明するかなり面倒な副作用があります。

これは、バブルをそのまま維持するためのより良い解決策です。:)

btnNewConfig.AddHandler(MouseLeftButtonUpEvent, 
                        new RoutedEventHandler(btnNewConfig_MouseUp), 
                        true);

RoutedEventArgsの代わりにイベント ハンドラーを宣言する必要がありますが、内部MouseButtonEventArgsにキャストすることができます。MouseButtonEventArgs

void btnNewConfig_MouseUp(object sender, RoutedEventArgs e)
{
    MouseButtonEventArgs args = e as MouseButtonEventArgs;
    // ...
}

の最後の引数に注意してAddHandlerください-trueにすると、前のハンドラーが設定されていてもイベントが発生しますe.Handled = true;

今についてPreviewMouseLeftButtonUp

トンネリング イベントは、子の前に親に対して発生します。バブリング - 反対。多くのイベント ハンドラーが関係している場合は、すべてのバブリングまたはすべてのトンネリングに固執する必要があります。そうしないと、追加するイベント ハンドラーが増えるほど、混乱が大きくなります。新しいイベント ハンドラーを 1 つ追加すると、アプリケーション内の他のすべてのイベント ハンドラーを再度確認する必要があります。

ほとんどの人は、バブリング モデルの方がはるかに自然なモデルであると感じています。これが、受け入れられた答えに問題がある理由です。

于 2018-05-09T22:56:40.467 に答える
3

ButtonHandledそのイベントに Mouse[Left/Right]Button[Up/Down] イベントを使用しています (そしてそれらを としてマークしています) Button.Click

Jobi が言ったように、イベントを使用できますがPreviewMouseLeftButtonUp、独自のボタン テンプレートを作成し、その動作を変更することをお勧めします。MouseLeftButtonUp(つまり、を as とマークしないでくださいHandled = true) または単に a 以外のものButtonを親コンテナーとして使用します (本当に必要なものによって異なります)。

于 2011-08-03T21:11:31.043 に答える