【问题标题】:WPF MouseRightButtonUp Event won't fireWPF MouseRightButtonUp 事件不会触发
【发布时间】: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


【解决方案1】:

Canvas 元素需要有背景色并且不能完全透明,因为在这两种情况下所有的事件都不会被消除。

如果你不想给它一个颜色,设置一个几乎透明的,你甚至不会注意到。 示例:#02FFFFFF

【讨论】:

  • 解决了,谢谢!我非常感谢它,尽管我不明白为什么这会改变事件的触发方式。你或其他人知道为什么吗?
  • 我不知道,但可能是因为它是透明的,所以要clicable的区域是空的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多