5

我对冒泡事件有疑问。我设法在边框、网格、堆栈面板中冒泡事件,但在 ScrollViewer 中没有

如果您查看下面的示例,您会注意到,当您单击 TextBlock 时,事件会被冒泡到 Grid。但是当我包含 ScrollViewer 时,事件会在此处停止并且不会发送到 Grid。

有人现在为什么会发生这种情况,是否可以修复?我真的需要能够通过 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您可以通过像这样MouseButtonEventArgs覆盖来防止ScrollViewer

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 回答