【发布时间】: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);
}
}
...我尝试将鼠标悬停在半空中并将其放在毛巾上,以消除任何可能导致虚假移动事件而没有任何好处的振动,无论如何这都不会导致后续的上下移动事件。
注意:我在另一台计算机上尝试过,结果完全相同。
【问题讨论】: