首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListView和ScrollViewer隐藏MouseLeftButtonDown

ListView和ScrollViewer隐藏MouseLeftButtonDown
EN

Stack Overflow用户
提问于 2015-05-04 22:28:47
回答 2查看 1.2K关注 0票数 0

为了演示这个问题,我有一个Xaml:

代码语言:javascript
复制
    <DockPanel MouseLeftButtonDown="DockPanel_MouseLeftButtonDown"  MouseLeftButtonUp="DockPanel_MouseLeftButtonUp">
        <ListView>
            <ListViewItem>ListViewItem</ListViewItem>
        </ListView>
        <TextBlock>TextBlock</TextBlock>
    </DockPanel>

事件处理程序是:

代码语言:javascript
复制
    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来说,同样的问题(列表视图包括它,所以我猜它是相同的问题)。有没有人知道为什么,如果能修好。我的意思是,让它启动,而不是试图使用另一个事件或另一个机制在一起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-05 22:04:53

首先,问题:正如怀疑的那样,问题出现在ScrollViewer:http://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/Controls/ScrollViewer.cs,488ab4a977a015eb中。

代码语言:javascript
复制
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        if (Focus())
            e.Handled = true;
        base.OnMouseLeftButtonDown(e);
    }

如您所见,它将MouseButtonEventArgs.Handled设置为true,这将停止事件的冒泡。

现在,解决方案是通过添加处理程序的方式实现的:

代码语言:javascript
复制
        MyListView.AddHandler(
            ListView.MouseLeftButtonDownEvent, 
            new MouseButtonEventHandler(ListView_MouseLeftButtonDown),
            true);

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

代码语言:javascript
复制
    private void ListView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        e.Handled = false;
    }
票数 3
EN

Stack Overflow用户

发布于 2015-06-25 14:24:47

当ScrollViewer阻塞我的MouseLeftButtonDown事件时,我遇到了一些类似的情况。我将一个内容控件封装到ScrollViewer中:

代码语言:javascript
复制
<ScrollViewer VerticalScrollBarVisibility="Auto">
     <ContentControl x:Name="Details"  />
 </ScrollViewer>

这是弹出式窗口的内部,它有拖放的行为。所以,因为我的行为没有收到这个事件,它没有工作。当我将IsHitTestVisible="True“添加到ScrollViewer中时,我的行为就开始起作用了,但是当然,我的ContentControl并没有响应任何点击。然后我看到了这个:

代码语言:javascript
复制
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
    if (Focus())
        e.Handled = true;
    base.OnMouseLeftButtonDown(e);
}

并试图添加Focusable="False“以将ScrollViewer排除在我的单击之外--它有效。我的行为工作,ContentControl内部的控件正在获取所有鼠标事件。

代码语言:javascript
复制
 <ScrollViewer VerticalScrollBarVisibility="Auto" Focusable="False">
     <ContentControl x:Name="Details"  />
 </ScrollViewer>

希望它能帮到别人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30041100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档