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
WPF中的MouseMove事件_Wpf - Fatal编程技术网

WPF中的MouseMove事件

WPF中的MouseMove事件,wpf,Wpf,在WPF中,当触发MouseMove事件时,我想检查是否按下了鼠标左键,如果按下了鼠标左键,我想进行一些计算 我试过这个: private void Window_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { Calculate(); } } 但是,当我左键单击并按住鼠标并在屏幕上移动鼠标时,Calculate(

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

我试过这个:

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并在原始线程中更新它。