2009-06-09 14 views
3

我有一個畫布對象,我灑在它的夢幻般的控制。我使用ScaleTransform對象來縮放畫布,以便放大/縮小。Canvas點擊Silverlight中的事件時,不超過UIElement

我已經連接了控件,這樣我就可以拖動它們,並且使用MouseLeftButtonDown,MouseLeftButtonUp和MouseMove進行拖放。現在,我只想點擊畫布上的按鈕來啓用事件。當我讀取畫布對象的docs時,我發現MouseLeftButtonDown事件僅在UIElement上觸發。

當鼠標左鍵是 按下時發生(或當 觸摸平板PC觸針的尖端)在鼠標 指針懸停在的UIElement。 (繼承自UIElement。)

不幸的是,我希望相反行爲。我想知道何時在畫布上單擊鼠標,而鼠標指針未在任何控件上。由於我是Silverlight的新手,因此我可能會以錯誤的方式做到這一點。有沒有我忽略的東西?我是否以這種錯誤的方式去做?我正在尋找一些幫助,也許很多方向。

回答

4

我不是Silverlight的大師,但你能不能增加一個透明UIElementCanvas,低於所有其他UIElement S,並用它來確定用戶是否點擊的其他任何拖動/落能夠要素之外。

+0

這就是我所做的,它運作良好。 –

+4

我認爲你需要設置畫布的背景.. –

+0

+1 @MichaelSync將畫布的背景設置爲透明,而不是默認的{x:Null}來獲得鼠標事件 –

1

我想你可能會解釋錯誤的文檔。根據MSDN,畫布本身就是一個UIElement的實現:爲最頂層的UIElement

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

從我的經驗,並糾正我,如果我錯了,通常的MouseLeftButtonDown僅火災點擊。因此,如果您爲Canvas實現MouseLeftButtonDown,則應該只在點擊Canvas時觸發,而不在按鈕被單擊時觸發。我會說試試看。

+0

@guard,我看到了相反的情況。當我包含這兩種方法時,它們都會在點擊放置在畫布上的UIElement時觸發。 –

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 
    } 

} 
+0

我認爲你的答案很棒,但我不想在點擊時觸發頁面上的其他控件。非常感謝有用的迴應。 –

+0

謝謝丹。祝你好運! –

相關問題