【问题标题】:Spurious and Missing mouse events in WPF appWPF 应用程序中的虚假和丢失鼠标事件
【发布时间】:2015-12-31 16:00:19
【问题描述】:

我有一个 WPF 应用程序,其中有两个相互重叠的画布。 . .

<Canvas Name="GeometryCnv"  Canvas.Top="0" Canvas.Left="0" Margin="10,21,315,251"  />
<Canvas Name="ROIcnv" Background ="Transparent" Canvas.Top="0" Canvas.Left="0" Margin="10,21,315,251" MouseDown="ROIcnvMouseDown" MouseUp="ROIcnvMouseUp" MouseMove="ROIcnvMouseMove"/>

我在第一个画布上绘制了一些几何图形,并在第二个画布上绘制了一个矩形来表示感兴趣区域 (ROI),使用鼠标按下事件开始绘制,绘制时鼠标移动事件(调整大小或定位)矩形,以及结束绘图的 Mouse-up 事件。

除非它不能可靠地处理事件。它获取初始鼠标按下事件来启动它。它连续获取鼠标移动事件 - 不管鼠标是否移动 - 它根本没有得到鼠标向上事件,也没有得到任何后续的鼠标按下事件,比如我加倍-单击鼠标。
事件处理程序代码如下所示。 . .

        private void ROIcnvMouseDown(object sender, MouseButtonEventArgs e)
        {
            MouseLineBegin = Mouse.GetPosition(ROIcnv);
            bMouseDown = true;
        }


        private void ROIcnvMouseUp(object sender, MouseButtonEventArgs e)
        {
            MouseLineEnd = Mouse.GetPosition(ROIcnv);
            bMouseDown = false;
        }


        private void ROIcnvMouseMove(object sender, MouseEventArgs e)
        {
            iMM++; // counting mouse move events
            ROIcnv.Children.Clear();   // clear the ROI canvas
            if (bMouseDown)   // if we're drawing now 
            {
                MouseLineEnd = Mouse.GetPosition(ROIcnv);

                // get the upper left and lower right =  coords from the beginning and end points . . . 
                int ulx = 0;
                int uly = 0;
                int lrx = 0;
                int lry = 0;
                if (MouseLineEnd.X >= MouseLineBegin.X)
                {
                    ulx = (int) MouseLineBegin.X;
                    lrx = (int) MouseLineEnd.X; 
                }
                else
                {
                    lrx = (int)MouseLineBegin.X;
                    ulx = (int)MouseLineEnd.X; 
                }
                if (MouseLineEnd.Y >= MouseLineBegin.Y)
                {
                    uly = (int)MouseLineBegin.Y;
                    lry = (int)MouseLineEnd.Y;
                }
                else
                {
                    lry = (int)MouseLineBegin.Y;
                    uly = (int)MouseLineEnd.Y;
                }
                int h = Math.Abs(lry-uly);
                int w = Math.Abs(lrx-ulx);
                var rect = new Path
                    {
                        Data = new RectangleGeometry(new Rect(ulx, uly, w, h)),
                        Stroke = Brushes.Black,
                        StrokeThickness = 2
                    };
                 ROIcnv.Children.Add(rect);
            }
        }

...我尝试将鼠标悬停在半空中并将其放在毛巾上,以消除任何可能导致虚假移动事件而没有任何好处的振动,无论如何这都不会导致后续的上下移动事件。

注意:我在另一台计算机上尝试过,结果完全相同。

【问题讨论】:

    标签: wpf events


    【解决方案1】:

    如果您提供问题的最小工作示例(特别是您的 ROIcnvMouseDown 和 ROIcnvMouseUp 方法以及您的所有属性声明都缺失),您将获得更好的响应。问题可能是由于您新创建的 Path 对象干扰了鼠标消息,如果是这样,则可以通过将其 IsHitTestVisible 属性设置为 false 来修复它。不过需要一个最小的例子来确定这一点。

    更新:对不起,我的错,我一定把剪切粘贴塞进了我的测试应用程序。尝试捕获鼠标以响应鼠标按下事件:

    private void ROIcnvMouseDown(object sender, MouseButtonEventArgs e)
    {
        MouseLineBegin = Mouse.GetPosition(ROIcnv);
        bMouseDown = true;
        Mouse.Capture(sender as IInputElement);
    }
    

    当然你需要释放它以响应 MouseUp:

    private void ROIcnvMouseUp(object sender, MouseButtonEventArgs e)
    {
        MouseLineEnd = Mouse.GetPosition(ROIcnv);
        bMouseDown = false;
        Mouse.Capture(sender as IInputElement, CaptureMode.None);
        ROIcnv.Children.Clear();
    }
    

    我所做的另一件事是调用 ROIcnv.Children.Clear(); 以响应 MouseUp,因为我假设您不再希望选择矩形可见。在我的机器上,这不会导致任何虚假的鼠标移动事件。

    这能回答问题吗?

    【讨论】:

    • 我不知道你为什么说它们不见了——三个事件处理程序都在那里。哪些属性声明会有所帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多