以解释问题,我有这个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");
}
运行该应用程序并单击"文字屏幕"单词时,您会触发鼠标,然后触发鼠标。到目前为止,一切都很好。但是,当您单击单词时,listViewItem只会触发鼠标。ScrollViewer的同样问题(列表视图包括它,所以我猜这是同一问题)。是否有人知道为什么以及是否可以解决。由固定我的意思是让它开火,不要尝试一起使用其他事件或其他机制。
首先问题:由于怀疑,问题是在scrollviewer中:http://referencesource.microsoft.com/#presentationframework/framework/framework/framework/system/windows/windows/controls/scrollviewer.cs ,,4888888888888B4A977A015EB
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
if (Focus())
e.Handled = true;
base.OnMouseLeftButtonDown(e);
}
您可以看到,它设置了MouseButtoneVentargs。
现在的解决方案 - 它以您添加处理程序的方式:
MyListView.AddHandler(
ListView.MouseLeftButtonDownEvent,
new MouseButtonEventHandler(ListView_MouseLeftButtonDown),
true);
注意最后一个参数(true),即使EventArgs.hanlded设置为true,也会导致处理程序被调用。然后,您可以将其重置:
private void ListView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = false;
}
当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>
希望它能帮助某人。