5

イベントのバブリングに問題があります。ボーダー、グリッド、スタックパネルでイベントをバブルすることはできますが、ScrollViewer ではできません。

以下の例を見ると、TextBlock をクリックすると、イベントがグリッドまでバブルされていることがわかります。しかし、ScrollViewer を含めると、イベントはここで停止し、グリッドに送信されません。

これが起こる理由と、それを修正できるかどうかは誰ですか?常に使用しているため、ScrollViewer を介してイベントをバブルできるようにする必要があります。

<Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown">
        <!--<ScrollViewer MouseLeftButtonDown="ScrollViewer_MouseLeftButtonDown">-->
            <StackPanel Orientation="Vertical" MouseLeftButtonDown="StackPanel_MouseLeftButtonDown">
                <TextBlock Text="Click me to bubble an event" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/>
            </StackPanel>
        <!--</ScrollViewer>-->
</Grid>


public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("LayoutRoot clicked");
    }


    private void ScrollViewer_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("ScrollViewer clicked");
        e.Handled = false;
    }

    private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("StackPanel clicked");
        e.Handled = false;
    }

    private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("Textblock clicked");
        e.Handled = false;
    }
}
4

3 に答える 3

1

AddHandler(yourDelegate, True); を使用します。ビジュアル ツリー内の他のコントロールによって設定された Handled フラグを無視する、イベント ハンドラーを追加するための構文。

于 2011-03-02T20:58:31.220 に答える
0

このようにオーバーライドすることe.Handledでオンを防ぐことができますMouseButtonEventArgsScrollViewer

public sealed class ClickScrollViewer : ScrollViewer
{
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        this.Focus();
    }
}
于 2013-07-24T15:10:08.423 に答える
0

この問題があり、user572559 によって投稿された修正により問題が修正されました。それが必要な人のために、以下は私がしたことです(投稿用に変更されています):

_scrollViewer = new ScrollViewer();
_scrollViewer.AddHandler(
    ScrollViewer.MouseLeftButtonDownEvent, 
    new MouseButtonEventHandler(OnMouseLeftButtonDown),
    true);
_scrollViewer.AddHandler(
    ScrollViewer.MouseLeftButtonUpEvent, 
    new MouseButtonEventHandler(OnMouseLeftButtonUp), 
    true);

...

    void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        ...
    }

    void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        ...
    }

また、これらを扱っている場合は、MouseMove も扱っている可能性があることに注意してください。MouseMove は、これを行う必要なく機能しました。また、この方法ではサポートされていないようです (バブリング イベントではありません)。

于 2012-02-17T05:45:59.017 に答える