WPF中的MouseMove事件

时间:2011-09-16 15:39:39

标签: wpf

在WPF中触发MouseMove事件时,我想检查是否按下鼠标左键,如果按下了鼠标键我想做一些计算。

我试过这个:

private void Window_MouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        Calculate();
    }

 }

但是当我左键单击并按住并在屏幕上移动鼠标时,Calculate()只被调用一次(即当鼠标开始移动时),之后无论我在哪里移动鼠标,该方法都无法获得调用。

我希望在鼠标移动和按下鼠标左键的同时重复调用Calculate()方法。

4 个答案:

答案 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功能将捕获鼠标,直到用户释放鼠标左键。

http://msdn.microsoft.com/en-us/library/ttwy7427.aspx