3

我有一个画布对象,我在它上面撒了很棒的控件。我正在使用 ScaleTransform 对象来缩放画布,以便放大/缩小。

我已经连接了控件,以便我可以拖动它们,并且通过使用 MouseLeftButtonDown、MouseLeftButtonUp 和 MouseMove,拖放效果很好。现在,我想在仅单击画布时启用事件。当我阅读画布对象的文档时,我看到 MouseLeftButtonDown 事件仅在它位于 UIElement 上方时触发。

当鼠标指针位于 UIElement 上时按下鼠标左键(或触控笔的笔尖接触 Tablet PC)时发生。(继承自 UIElement。)

不幸的是,我想要相反的行为。我想知道鼠标何时在画布上单击,而鼠标指针不在任何控件上。由于我是 Silverlight 的新手,因此我可能会以错误的方式执行此操作。有什么我忽略的吗?我会以错误的方式解决这个问题吗?我正在寻找一些帮助,也许还有很多方向。

4

4 回答 4

4

我不是 Silverlight 大师,但您能否在所有其他 s 下方添加一个透明UIElement的, 并使用它来确定用户是否在任何其他可拖放元素之外单击。CanvasUIElement

于 2009-06-09T20:09:26.030 回答
2

您想知道点击何时发生在其他控件上Canvas而不是在其他控件上?

最自然的就是捕捉到了CanvasMouseLeftButtonDown在该事件中,采取高峰查看点击发生的位置。UIElement然后在点击下的 s处达到峰值。我建议您将所有内容保持在绝对坐标中,以保持直线。就像是:

void Page_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Point p = e.GetPosition(null);
    var elements =  VisualTreeHelper.FindElementsInHostCoordinates(p, App.Current.RootVisual);
    foreach (var element in elements)
    {
        //Figure out if you're over a particular UI element
    }

}
于 2009-06-09T21:50:31.053 回答
1

我认为您可能对文档的解释有误。根据 MSDN,Canvas 本身是一个实现UIElement

System.Windows.UIElement
  System.Windows.FrameworkElement
    System.Windows.Controls.Panel
      System.Windows.Controls.Canvas

根据我的经验,如果我错了,请纠正我,MouseLeftButtonDown 通常只触发最顶部的 UIElement 点击。因此,如果您为 Canvas 实现 MouseLeftButtonDown,它应该只在单击 Canvas 时触发,而不是在单击按钮时触发。我会说先试试看。

于 2009-06-09T20:25:31.787 回答
0

在 WPF 中,我认为这可以通过路由事件轻松解决。但是,Silverlight 没有获得此功能。您可能想检查一下VisualTreeHelper.FindElementsInHostCoordinates。本文对此进行了一些介绍。

http://www.andybeaulieu.com/Default.aspx?tabid=67&EntryID=95

于 2009-06-09T22:25:38.330 回答