我对冒泡事件有疑问。我设法在边框,网格,堆栈面板中冒泡,而不是在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;
}
}
答案 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();
}
}