事件冒泡问题(ScrollViewer)

时间:2010-07-07 19:49:09

标签: silverlight events scrollviewer

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

如果您查看下面的示例,您会注意到当您单击TextBlock时,事件会被标记为Grid。但是当我包含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;
    }
}

3 个答案:

答案 0 :(得分:1)

使用AddHandler(yourDelegate,True);添加事件处理程序的语法,它将忽略可视树中其他控件设置的Handled标志。

答案 1 :(得分: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为我工作而不需要这样做,而且它似乎也不支持这种方式(不是冒泡事件)。

答案 2 :(得分:0)

您可以通过覆盖e.Handled来阻止MouseButtonEventArgs上的ScrollViewer

public sealed class ClickScrollViewer : ScrollViewer
{
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        this.Focus();
    }
}