[英]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
上單擊而不是在其他控件上單擊嗎?
最自然的是捕獲Canvas
的MouseLeftButtonDown
。 在該事件的內部,花一個高峰查看點擊發生的位置。 然后在點擊下的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.