WPF中的陷阱鼠标

我有一个canvas,我有一个图像。 我可以使用鼠标移动该图像(拖放)。 我想阻止用户将图像移到canvas之外。

有没有什么方法可以捕获鼠标指针,因此它只能在canvas内移动? 因此,当用户尝试将鼠标移动到canvas外时,光标将保留在canvas的边缘。

此行为的一个示例是移动窗口时,您无法在任务栏上移动它。 当您尝试在任务栏上移动它时,鼠标光标停留在任务栏的边缘,拒绝移动任务栏顶部。

一个表现良好的应用程序不应该试图约束鼠标指针的移动。 用户而不是您的应用程序是否处于控制状态,您描述的拖动窗口时鼠标指针无法在任务栏上移动的行为不是我所经历过的。

但是,当用户在canvas中拖动图像时,您可以约束图像的移动,使其即使在用户将鼠标指针移动到canvas外时也会保留在canvas内。

在Windows中执行拖动操作时,通常会捕获鼠标 。 这意味着即使应用程序窗口移出应用程序窗口,您的应用程序也会继续接收有关鼠标指针移动的信息。

经过更多的搜索,我发现user32.dll中有一个名为ClipCursor的函数正是我想做的。

以下是捕获鼠标光标的示例应用程序示例。 单击Button1时,光标将被限制在(10,10,500,500)的矩形中。 按下Button2(或关闭应用程序)时,光标将再次空闲。

XAML:

      

CS:

 [DllImport("user32.dll")] static extern void ClipCursor(ref System.Drawing.Rectangle rect); [DllImport("user32.dll")] static extern void ClipCursor(IntPtr rect); public MainWindow() { InitializeComponent(); } private void button1_Click(object sender, RoutedEventArgs e) { System.Drawing.Rectangle r = new System.Drawing.Rectangle(10, 10, 500, 500); ClipCursor(ref r); } private void button2_Click(object sender, RoutedEventArgs e) { ClipCursor(IntPtr.Zero); }