为了演示这个问题,我有一个Xaml:
<DockPanel MouseLeftButtonDown="DockPanel_MouseLeftButtonDown" MouseLeftButtonUp="DockPanel_MouseLeftButtonUp">
<ListView>
<ListViewItem>ListViewItem</ListViewItem>
</ListView>
<TextBlock>TextBlock</TextBlock>
</DockPanel>事件处理程序是:
private void DockPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Console.WriteLine("DockPanel_MouseLeftButtonDown");
}
private void DockPanel_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Console.WriteLine("DockPanel_MouseLeftButtonUp");
}当您运行该应用程序并单击单词TextBlock时,MouseDown会被触发,MouseUp随后会被触发。到目前一切尚好。但是,当您单击单词ListViewItem时,只会触发MouseUp。对于ScrollViewer来说,同样的问题(列表视图包括它,所以我猜它是相同的问题)。有没有人知道为什么,如果能修好。我的意思是,让它启动,而不是试图使用另一个事件或另一个机制在一起。
发布于 2015-05-05 22:04:53
首先,问题:正如怀疑的那样,问题出现在ScrollViewer:http://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/Controls/ScrollViewer.cs,488ab4a977a015eb中。
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
if (Focus())
e.Handled = true;
base.OnMouseLeftButtonDown(e);
}如您所见,它将MouseButtonEventArgs.Handled设置为true,这将停止事件的冒泡。
现在,解决方案是通过添加处理程序的方式实现的:
MyListView.AddHandler(
ListView.MouseLeftButtonDownEvent,
new MouseButtonEventHandler(ListView_MouseLeftButtonDown),
true);注意,即使EventArgs.Hanlded设置为true,它也会导致调用处理程序的最后一个参数(true)。然后你可以重置它:
private void ListView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = false;
}发布于 2015-06-25 14:24:47
当ScrollViewer阻塞我的MouseLeftButtonDown事件时,我遇到了一些类似的情况。我将一个内容控件封装到ScrollViewer中:
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ContentControl x:Name="Details" />
</ScrollViewer>这是弹出式窗口的内部,它有拖放的行为。所以,因为我的行为没有收到这个事件,它没有工作。当我将IsHitTestVisible="True“添加到ScrollViewer中时,我的行为就开始起作用了,但是当然,我的ContentControl并没有响应任何点击。然后我看到了这个:
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
if (Focus())
e.Handled = true;
base.OnMouseLeftButtonDown(e);
}并试图添加Focusable="False“以将ScrollViewer排除在我的单击之外--它有效。我的行为工作,ContentControl内部的控件正在获取所有鼠标事件。
<ScrollViewer VerticalScrollBarVisibility="Auto" Focusable="False">
<ContentControl x:Name="Details" />
</ScrollViewer>希望它能帮到别人。
https://stackoverflow.com/questions/30041100
复制相似问题