WPF中的MouseMove事件
在WPF中,当触发MouseMove事件时,我想检查是否按下了鼠标左键,如果按下了鼠标左键,我想进行一些计算 我试过这个:WPF中的MouseMove事件,wpf,Wpf,在WPF中,当触发MouseMove事件时,我想检查是否按下了鼠标左键,如果按下了鼠标左键,我想进行一些计算 我试过这个: private void Window_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { Calculate(); } } 但是,当我左键单击并按住鼠标并在屏幕上移动鼠标时,Calculate(
private void Window_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Calculate();
}
}
但是,当我左键单击并按住鼠标并在屏幕上移动鼠标时,Calculate()只会被调用一次(即当鼠标开始移动时),此后无论我将鼠标移动到何处,都不会调用该方法
我希望在鼠标移动和按下鼠标左键时重复调用Calculate()方法 对我来说,一个简单的测试表明这是可行的:
private void MouseMoveEvent(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
_vm.MoveCount++;
}
}
A可能会怀疑您的计算
方法是导致问题的同步方法
尝试调用下面的方法。这将在新线程中启动计算方法。然后,文本框的更新将在原始线程中进行
private void WindowMouseMoveEvent(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
var worker = new BackgroundWorker();
worker.DoWork += Calculate;
worker.RunWorkerCompleted +=
(o, args) => myTextBox.Text = (string)args.Result;
worker.RunWorkerAsync();
}
}
private void Calculate(object sender, DoWorkEventArgs args)
{
//do work
args.Result = "my new value"
}
对我来说,一个简单的测试表明这是可行的:
private void MouseMoveEvent(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
_vm.MoveCount++;
}
}
A可能会怀疑您的计算
方法是导致问题的同步方法
尝试调用下面的方法。这将在新线程中启动计算方法。然后,文本框的更新将在原始线程中进行
private void WindowMouseMoveEvent(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
var worker = new BackgroundWorker();
worker.DoWork += Calculate;
worker.RunWorkerCompleted +=
(o, args) => myTextBox.Text = (string)args.Result;
worker.RunWorkerAsync();
}
}
private void Calculate(object sender, DoWorkEventArgs args)
{
//do work
args.Result = "my new value"
}
我已经证实它是有效的。如果我按住鼠标按钮并将其移动到窗口上,则只要我将鼠标移动到窗口上,就会重复调用该函数。可能是您的计算函数执行和返回要花费很多时间。因此,它需要很长时间才能再次被调用。在这种情况下,使用多个线程调用Calculate()
为了测试这是否有效,我在窗口中添加了一个标签,并将line label.Content=DateTime.Now.Ticks;而不是这里的计算函数。它不断更新值。我已验证它是否有效。如果我按住鼠标按钮并将其移动到窗口上,则只要我将鼠标移动到窗口上,就会重复调用该函数。可能是您的计算函数执行和返回要花费很多时间。因此,它需要很长时间才能再次被调用。在这种情况下,使用多个线程调用Calculate()
为了测试这是否有效,我在窗口中添加了一个标签,并将line label.Content=DateTime.Now.Ticks;而不是这里的计算函数。它会不断更新值。如果使用从Panel类派生的元素,则仅当它设置了后台属性时才会触发鼠标事件。如果使用从Panel类派生的元素,则仅当它设置了后台属性时才会触发鼠标事件。如果适用,CRectTracker::Track函数将捕获鼠标,直到用户释放鼠标左键
如果适用,CRectTracker::Track函数将捕获鼠标,直到用户释放鼠标左键
你确定这不是别的东西吗?对我来说,一个简单的测试显示MouseMove总是被调用,即使按下鼠标左键。。。奇怪-但是你不能在LButtonDown上设置一个标志(和MouseCapture?),然后在LButtonUp上释放标志(和捕获)吗?对我来说似乎有点干净,应该可以工作。@Ray:是的,但可能e.LeftButton状态只有在按下按钮后才被设置-这似乎是这里的问题。这是真的,MouseMove事件被称为罚款。但是Calculate方法只调用了一次,我希望在鼠标移动时重复调用它。你确定它不是别的吗?对我来说,一个简单的测试显示MouseMove总是被调用,即使按下鼠标左键。。。奇怪-但是你不能在LButtonDown上设置一个标志(和MouseCapture?),然后在LButtonUp上释放标志(和捕获)吗?对我来说似乎有点干净,应该可以工作。@Ray:是的,但可能e.LeftButton状态只有在按下按钮后才被设置-这似乎是这里的问题。这是真的,MouseMove事件被称为罚款。但是Calculate方法只调用一次,我希望在鼠标移动时重复调用它。Calculate方法大约有50行,它有一些if/else,几个Math.Abs和一个Math.Atan2计算。最后,它必须更新一个简单的TextBLock.Text值。我尝试了您推荐的调用方法,但它生成了一个异常“调用线程无法访问此对象,因为另一个线程拥有它”。@xjay13使用方法更新,以在新线程中调用calculate并在原始线程中更新它。calculate方法大约有50行,它有一些if/else,两个Math.Abs和一个Math.Atan2计算。最后,它必须更新一个简单的TextBLock.Text值。我尝试了您推荐的调用方法,但它生成了一个异常“调用线程无法访问此对象,因为另一个线程拥有它”。@xjay13使用方法更新,以在新线程中调用calculate并在原始线程中更新它。