WPF ListView和ScrollViewer隐藏MouseLeftButtonDown

时间:2015-05-04 22:28:47

标签: wpf listview scrollviewer mouseleftbuttondown

为了解决这个问题我有这个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的相同问题(列表视图包含它,所以我猜它是同样的问题)。 有人知道为什么以及是否可以解决这个问题。 通过修复我的意思是让它开火而不是尝试一起使用另一个事件或其他机制。

2 个答案:

答案 0 :(得分:2)

首先是问题: 怀疑问题出在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);

注意最后一个参数(true)它会导致调用处理程序,即使EventArgs.Hanlded设置为true也是如此。 然后你可以重置它:

    private void ListView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        e.Handled = false;
    }

答案 1 :(得分:-2)

当ScrollViewer阻止我的MouseLeftButtonDown事件时,我的情况有些类似。我有一个包含在ScrollViewer中的内容控件:

<ScrollViewer VerticalScrollBarVisibility="Auto">
     <ContentControl x:Name="Details"  />
 </ScrollViewer>

这是Popup内部的拖放行为。所以,因为我的行为没有收到这个事件,所以它不起作用。当我向ScrollViewer添加IsHitTestVisible =“True”时,我的行为开始起作用,但当然我的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>

希望它会对某人有所帮助。