Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 事件冒泡问题(ScrollViewer)_Silverlight_Events_Scrollviewer - Fatal编程技术网

Silverlight 事件冒泡问题(ScrollViewer)

Silverlight 事件冒泡问题(ScrollViewer),silverlight,events,scrollviewer,Silverlight,Events,Scrollviewer,我对泡泡活动有意见。我设法在borders、grid、stackpanel中冒泡事件,但不是在ScrollViewer中 如果您查看下面的示例,您会注意到,当您单击TextBlock时,该事件将以气泡形式出现在网格中。但是当我包含ScrollViewer时,事件停止在这里,不会发送到网格 现在有人知道这是怎么回事吗?如果可以解决的话?我真的需要能够通过ScrollViewer冒泡事件,因为我一直在使用它 <Grid MouseLeftButtonDown="Grid_MouseLeftBu

我对泡泡活动有意见。我设法在borders、grid、stackpanel中冒泡事件,但不是在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;
    }
}

公共部分类主页面:UserControl
{
公共主页()
{
初始化组件();
}
私有void Grid_MouseLeftButtonDown(对象发送器,MouseButtonEventArgs e)
{
MessageBox.Show(“单击LayoutRoot”);
}
私有void ScrollViewer_MouseLeftButtonDown(对象发送器,MouseButtonEventArgs e)
{
MessageBox.Show(“ScrollViewer已单击”);
e、 已处理=错误;
}
私有void StackPanel_MouseLeftButtonDown(对象发送器,MouseButtonEventArgs e)
{
MessageBox.Show(“单击StackPanel”);
e、 已处理=错误;
}
私有void TextBlock_MouseLeftButtonDown(对象发送器,MouseButtonEventArgs e)
{
MessageBox.Show(“单击文本块”);
e、 已处理=错误;
}
}

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

我遇到了这个问题,用户572559发布的修复程序修复了我的问题。对于那些需要它的人,以下是我所做的(为发布而修改):


还请注意,如果您处理这些,您可能也在处理MouseMove。MouseMove为我工作时不需要这样做,而且它似乎也不以这种方式受支持(不是冒泡事件)。

您可以通过像这样覆盖
ScrollViewer
来防止
e.Handled
打开
MouseButtonEventArgs

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

ScrollViewer是一个密封类,不能从派生,请使用AddHandler。
    void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        ...
    }

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