簡體   English   中英

未通過UIElement時,Silverlight中的Canvas Click事件

[英]Canvas Click events in Silverlight when not over a UIElement

我有一個畫布對象,並且在其上撒滿了奇妙的控件。 我正在使用ScaleTransform對象縮放畫布,以便可以放大/縮小。

我已經連接好控件,以便可以拖動它們,並且通過使用MouseLeftButtonDown,MouseLeftButtonUp和MouseMove可以很好地進行拖放。 現在,我想在僅單擊“畫布”時啟用事件。 當我閱讀canvas對象的文檔時 ,我看到MouseLeftButtonDown事件僅在它通過UIElement時才觸發。

在鼠標指針懸停在UIElement上且按下鼠標左鍵(或筆尖接觸Tablet PC)時發生。 (繼承自UIElement。)

不幸的是,我想要相反的行為。 我想知道鼠標懸停在任何控件上時何時單擊畫布上的鼠標。 由於我是Silverlight的新手,所以我可能做錯了方法。 有什么我忽略的東西嗎? 我會以錯誤的方式處理嗎? 我正在尋找一點幫助,也許是很多方向。

我不是Silverlight專家,但是您可以在所有其他UIElement下方的Canvas添加一個透明UIElement ,並使用它來確定用戶是否單擊了其他任何可拖放元素之外。

您想知道何時在Canvas上單擊而不是在其他控件上單擊嗎?

最自然的是捕獲CanvasMouseLeftButtonDown 在該事件的內部,花一個高峰查看點擊發生的位置。 然后在點擊下的UIElement處達到峰值。 我建議您將所有內容都保持絕對坐標以使內容保持筆直。 就像是:

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
    }

}

我認為您可能會誤解文檔。 根據MSDN,Canvas本身是UIElement的實現:

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

根據我的經驗,如果我錯了,請糾正我,MouseLeftButtonDown通常僅針對最頂部單擊的UIElement觸發。 因此,如果為Canvas實現MouseLeftButtonDown,則僅在單擊Canvas時才觸發,而在單擊按鈕時不觸發。 我會說先嘗試一下。

在WPF中,我認為這可以通過路由事件輕松解決。 但是,Silverlight沒有獲得此功能。 您可能要簽出VisualTreeHelper.FindElementsInHostCoordinates 本文涵蓋了一點。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM