在WPF中触发MouseMove事件时,我想检查是否按下鼠标左键,如果按下了鼠标键我想做一些计算。
我试过这个:
private void Window_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Calculate();
}
}
但是当我左键单击并按住并在屏幕上移动鼠标时,Calculate()只被调用一次(即当鼠标开始移动时),之后无论我在哪里移动鼠标,该方法都无法获得调用。
我希望在鼠标移动和按下鼠标左键的同时重复调用Calculate()方法。
答案 0 :(得分:1)
对我来说,一个简单的测试表明这有效:
private void MouseMoveEvent(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
_vm.MoveCount++;
}
}
A会怀疑你的Calculate
方法是导致问题的同步方法。
尝试调用以下方法。这将在新线程中启动calculate方法。然后更新文本框将在原始线程中发生。
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"
}
答案 1 :(得分:0)
我已经确认它有效。如果我按住鼠标按钮并将其移到窗口上,只要我将鼠标移到窗口上,就会重复调用该函数。可能是你的Calculate函数需要花费大量时间来执行并返回。所以很长一段时间再次被召回。在这种情况下,使用多个线程调用Calculate()。
为了测试这是否有效,我在Window中添加了一个标签并放置了line label.Content = DateTime.Now.Ticks;而不是这里的计算功能。它不断更新价值。
答案 2 :(得分:0)
如果您正在处理从Panel类派生的元素,则只有在设置了Background属性时才会触发鼠标事件。
答案 3 :(得分:0)
如果适用,CRectTracker :: Track功能将捕获鼠标,直到用户释放鼠标左键。