【发布时间】:2010-06-14 22:02:22
【问题描述】:
当我调用 CaptureMouse() 响应鼠标中键的 MouseDown 时,它将捕获然后释放鼠标。
嗯?
我尝试过使用预览事件,设置 Handled=true,并没有什么不同。我不了解 WPF 中的鼠标捕获吗?
这里有一些重现问题的最小示例代码。
// TestListBox.cs
using System.Diagnostics;
using System.Windows.Controls;
namespace Local
{
public class TestListBox : ListBox
{
public TestListBox()
{
MouseDown += (_, e) =>
{
Debug.WriteLine("+MouseDown");
Debug.WriteLine(" Capture: " + CaptureMouse());
Debug.WriteLine("-MouseDown");
};
GotMouseCapture += (_, e) => Debug.WriteLine("GotMouseCapture");
LostMouseCapture += (_, e) => Debug.WriteLine("LostMouseCapture");
}
}
}
为主窗口生成一个默认的 WPF 应用程序将使用测试类:
<Window x:Class="Local.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Local"
Title="MainWindow" Height="350" Width="525">
<local:TestListBox>
<ListBoxItem>1</ListBoxItem>
<ListBoxItem>2</ListBoxItem>
<ListBoxItem>3</ListBoxItem>
<ListBoxItem>4</ListBoxItem>
</local:TestListBox>
</Window>
单击中间按钮后,我得到以下输出:
+MouseDown
GotMouseCapture
LostMouseCapture
Capture: True
-MouseDown
所以我调用 CaptureMouse,它依次抓取然后释放捕获,但返回 true 表示已成功获取捕获。
这里发生了什么?这可能是因为我的罗技鼠标驱动程序做了一些愚蠢的事情,试图启动“超滚动”或其他什么?
【问题讨论】:
标签: wpf