WPF ListView and ScrollViewer hide 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");
    }

运行该应用程序并单击"文字屏幕"单词时,您会触发鼠标,然后触发鼠标。到目前为止,一切都很好。但是,当您单击单词时,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>

希望它能帮助某人。

最新更新