2013-12-17 83 views
3

我有一個非常簡單的應用程序,但它是一個問題。我有一個按鈕(在網格上),我想知道,當用戶在運行時點擊它時,用戶點擊了按鈕(X,Y座標)的哪一部分。現在,我無法在Click事件處理程序中跟蹤鼠標位置,因爲它的參數「e」是類型「RoutedEventArgs」,並且它沒有給出發生鼠標點擊的位置。Wpf應用程序沒有正確響應事件

因此我嘗試了其他事件處理程序「MouseLeftButtonDown」事件。這有一個參數「e」,它給出了一個GetPosition()方法,可以給鼠標指針的位置。但問題是,在運行時,當我點擊按鈕時,這個事件處理程序根本不會被調用!這裏是我的兩個事件處理程序代碼:

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     string sName = sender.GetType().Name; 
     string sSrc = e.Source.ToString(); 
     string soSrc = e.OriginalSource.ToString(); 

     MessageBox.Show("Sender Name: " + sName + ",\nSource: " + sSrc + ",\nOrigSource: " + soSrc + ",\nevent:" + e.RoutedEvent.ToString()); 
    } 

    private void button1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     string sName = sender.GetType().Name; 
     string sSrc = e.Source.ToString(); 
     string soSrc = e.OriginalSource.ToString(); 
     textBox1.Text = "LeftButtonPressed on button1"; 
    } 

如果我只保留點擊事件處理程序,它的工作原理。如果我只保留MouseLeftButtonDown事件處理程序,它不起作用。如果我保持這兩者,那麼只有Click事件處理程序被調用!任何人都可以幫忙嗎?

在此先感謝。

+0

刪除messagebox –

回答

0

Button控件將MouseLeftButtonDown事件吞併(標記爲「已處理」)事件作爲其Click事件的一部分。它可以添加一個監聽器,即使事件已經處理了一個觸發,你這樣做:

button1.AddHandler(Button.MouseLeftButtonDownEvent, 
    new MouseButtonEventHandler(button1_MouseLeftButtonDown), 
    true // also capture handled events 
); 

或者,你可以繼承Button並覆蓋其OnMouseLeftButtonDown事件:

public class ExtendedButton : Button 
{ 
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 

    } 
} 
+0

好的,你能否請詳細解釋一下按鈕的MouseLeftButtonDown和MouseLeftButtonUp事件會發生什麼?如果Click事件吞噬了這些事件,如果我們想要鼠標按鈕事件和鼠標按鈕事件的不同功能,我們該怎麼辦?任何幫助將不勝感激。 – user2755525

+0

@ user2755525正如我在答案中所提到的那樣,您可以隨時在代碼中手動添加處理程序(我認爲您可以從XAML中添加「處理事件太」偵聽器)。我只是添加了另一種選擇 - 「Button」爲鼠標左鍵提供了一個保護覆蓋,所以你可以創建一個子類並以這種方式處理它。 – McGarnagle

+0

非常感謝您的幫助。我會嘗試這些選項。再次感謝。 – user2755525