Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果鼠标在对象上失去焦点,为什么MouseMove事件不起作用?_C#_Wpf_Event Handling_Mouse - Fatal编程技术网

C# 如果鼠标在对象上失去焦点,为什么MouseMove事件不起作用?

C# 如果鼠标在对象上失去焦点,为什么MouseMove事件不起作用?,c#,wpf,event-handling,mouse,C#,Wpf,Event Handling,Mouse,我的程序中基本上有一个简单的问题,我只是想确保一切正常。它应该在单击鼠标按钮时添加MouseEventHandler,然后随着鼠标移动圆圈,直到移除事件处理程序。我将代码简化为最基本的内容: XAML: 现在,一般来说,这段代码工作得很好,我认为它非常简洁,因为它在用户实际按下按钮之前不会检查鼠标的移动。不过,我的问题如下: 我不得不将MouseMove事件添加到网格中,而不是添加到圆中,因为一旦鼠标指针移动过快而失去了圆的焦点,它就不会再触发MouseMove事件。但为什么会发生这种情况呢?在

我的程序中基本上有一个简单的问题,我只是想确保一切正常。它应该在单击鼠标按钮时添加MouseEventHandler,然后随着鼠标移动圆圈,直到移除事件处理程序。我将代码简化为最基本的内容:

XAML:

现在,一般来说,这段代码工作得很好,我认为它非常简洁,因为它在用户实际按下按钮之前不会检查鼠标的移动。不过,我的问题如下:


我不得不将MouseMove事件添加到网格中,而不是添加到圆中,因为一旦鼠标指针移动过快而失去了圆的焦点,它就不会再触发MouseMove事件。但为什么会发生这种情况呢?在活动开始时,鼠标肯定在圆圈上方,然后移动。是的,它离开了圆圈,但这不应该仍然触发事件吗?

只要鼠标悬停在某个控件上,该控件就只能获取鼠标事件

如果移动到新控件,鼠标将从旧控件上脱离并挂接到新控件上


有很多方法可以创建一个全局钩子连接到整个过程,但我想这不是我们要讨论的。

一个控件只在鼠标悬停在该控件上时获取鼠标事件

如果移动到新控件,鼠标将从旧控件上脱离并挂接到新控件上


有很多方法可以创建一个全局钩子连接到整个过程,但我想这不是我们所说的。

如果使用Grid.MouseDown事件并检查oldPoint是否在椭圆内,然后处理MouseMove事件,则不会看到这种奇怪的行为


我还建议探索拖拽事件

再加上Peter所说的,如果您使用Grid.MouseDown事件并检查oldPoint是否在椭圆内,然后处理MouseMove事件,则不会看到这种奇怪的行为

我还建议探索拖拽事件

您可以创建和处理椭圆中的所有事件

<Grid Name="grid1" Background="White">
    <Ellipse Height="50" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="{x:Null}" VerticalAlignment="Top" Width="50" Fill="Black"
             MouseLeftButtonDown="ellipse1_MouseDown" MouseLeftButtonUp="ellipse1_MouseUp" />
</Grid>
我已将grid\u MouseMove移动并重命名为ellipse1\u MouseMove。

您可以在椭圆中处理所有事件

<Grid Name="grid1" Background="White">
    <Ellipse Height="50" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="{x:Null}" VerticalAlignment="Top" Width="50" Fill="Black"
             MouseLeftButtonDown="ellipse1_MouseDown" MouseLeftButtonUp="ellipse1_MouseUp" />
</Grid>


我已将grid\u MouseMove移动并重命名为ellipse1\u MouseMove。

您尝试过吗?@LPL如何使用鼠标。捕获方法?我看了msdn的文章,但是直接使用没有多大帮助。你试过了吗?@LPL我如何使用鼠标。捕获方法?我看了msdn的文章,但是直接使用没有多大帮助。好的,谢谢,我想可能是这样的。所以这个事件是在鼠标获得新位置时触发的,而不是在鼠标改变初始位置时触发的?比这个复杂一点。这涉及到几个事件——还有一些人仍然通知旧控件按钮释放。OnMouseEnter/Leave不是在Enter/Leave中触发的吗?如果鼠标在开始时总是在圆圈内移动,因此既没有进入也没有离开圆圈,那么圆圈将如何随我的鼠标移动?如果您希望您的鼠标始终挂在圆圈上,您一定要使用SetWindowsHookEx/UnhookWindowsHookEx。感谢您指出,但对于这么简单的事情来说似乎有点太过努力了……好吧,谢谢,我想可能是这样的。所以这个事件是在鼠标获得新位置时触发的,而不是在鼠标改变初始位置时触发的?比这个复杂一点。这涉及到几个事件——还有一些人仍然通知旧控件按钮释放。OnMouseEnter/Leave不是在Enter/Leave中触发的吗?如果鼠标在开始时总是在圆圈内移动,因此既没有进入也没有离开圆圈,那么圆圈将如何随我的鼠标移动?如果您希望您的鼠标始终挂在圆圈上,您一定要使用SetWindowsHookEx/UnhookWindowsHookEx。感谢您指出,但对于这么简单的事情来说,这似乎有点太费劲了……在这种情况下,我怎么能使用拖动事件呢?我知道拖动信息,但我也可以用它来拖动WPF项目吗?关于你的第一个建议,你的意思是,除了通过MouseLeave触发相同的功能MouseMove之外?@Phil,拖放事件适用于任何WPF项目,甚至是装饰层。在这种情况下,我如何确切地使用拖动事件?我知道拖动信息,但我也可以用它来拖动WPF项目吗?关于你的第一个建议,你的意思是除了通过MouseLeave触发相同的功能MouseMove吗?@Phil,拖放事件适用于任何WPF项目,甚至是装饰层。谢谢,对我的问题很有用。谢谢,对我的问题很有用。
<Grid Name="grid1" Background="White">
    <Ellipse Height="50" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="{x:Null}" VerticalAlignment="Top" Width="50" Fill="Black"
             MouseLeftButtonDown="ellipse1_MouseDown" MouseLeftButtonUp="ellipse1_MouseUp" />
</Grid>
private void ellipse1_MouseDown(object sender, MouseButtonEventArgs e)
{
    Mouse.Capture(ellipse1);
    _oldPoint = e.GetPosition(grid1);
    ellipse1.MouseMove += new MouseEventHandler(ellipse1_MouseMove);
}

private void ellipse1_MouseUp(object sender, MouseButtonEventArgs e)
{
    Mouse.Capture(null);
    ellipse1.MouseMove -= new MouseEventHandler(ellipse1_MouseMove);
}