【发布时间】:2019-07-09 20:29:34
【问题描述】:
当用户释放鼠标右键时,MouseRightButtonUp 事件不会触发。用户单击鼠标右键开始绘制矩形,因此当他们抬起右键时,需要通过将 bool 设置为 false 来停止绘制。然后,鼠标移动事件知道不继续绘制矩形。鼠标右键按下事件触发正常,但鼠标右键按下事件不会触发。
我目前认为这是因为 ZoomBorder 类,但我几乎可以肯定它不使用任何右键事件。当我使用断点查看鼠标右键单击是否触发时,它有时会识别它触发,但是当鼠标右键启动时,它会在看似随机的时间这样做,但这不是时间延迟。如果鼠标右键向上并且您将其移动了一堆,则有时会触发该事件。
我尝试将事件移动到画布、ZoomBorder 和网格中。
XAML:
<Grid Grid.Column="2" MinWidth="700">
<ScrollViewer>
<paz:ZoomBorder Name="zoomBorder" Stretch="None" ZoomSpeed="1.1"
Background="White" ClipToBounds="True"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Canvas Name="gridCanvasOverImage">
<Canvas Name="canvasOverImage">
<Image x:Name="loadedImage"
Stretch="Uniform"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
MouseRightButtonDown=
"LoadedImage_MouseRightButtonDown"
MouseRightButtonUp=
"LoadedImage_MouseRightButtonUp"
MouseMove="LoadedImage_MouseMove"/>
<Rectangle x:Name="rectangleOverImage"
Stroke="SkyBlue"/>
</Canvas>
</Canvas>
</paz:ZoomBorder>
</ScrollViewer>
</Grid>
C# 中的代码:
// <Simplified C#>
//* Mouse button up
private void LoadedImage_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
drawRect = true; // Starts drawing of rectangle
}
//* Mouse Button Down
private void LoadedImage_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
drawRect = false;
}
//* Drawing Rectangle
private void LoadedImage_MouseMove(object sender, MouseEventArgs e)
{
if (drawRect) // If the right mouse button is down
{
// Do Stuff
}
}
// </Simplified C#>
当用户抬起鼠标右键时,它会将绘图变量 bool 设置为 false,这应该会阻止程序在 LoadedImage_MouseOver 中执行操作,但事实并非如此。单击右键后,即使您再次抬起鼠标按钮,它也会继续绘制矩形。
感谢您的任何回答,不胜感激。
【问题讨论】:
-
当您移动鼠标时,LoadedImage_MouseMove 是继续触发还是刚开始触发?如果它最初只是触发,那么它在更改为 false 后将永远不会拾取 drawRect。
-
大多数情况下,鼠标事件在到达您的处理程序之前由框架处理。处理Preview Events(例如 PreviewMouseRightButtonDown、PreviewMouseRightButtonUp)会更成功。
-
谢谢大家!它不适用于预览活动,但 Catarina 的解决方案完美运行。我不知道为什么,考虑到图像在画布内并且在图像上设置了点击事件,但是由于某种原因,画布不能是透明的。
标签: c# wpf event-handling