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