2010-03-27 134 views
3

我可以得到MouseEnter,MouseLeaveClick事件,但不是MouseLeftButtonDownMouseLeftButtonUpSilverlight MouseLeftButtonDown event not firing

這裏是我的XAML

<UserControl x:Class="Dive.Map.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
     <Canvas x:Name="LayoutRoot" MouseLeftButtonDown="LayoutRoot_MouseLeftButtonDown"> 
      <Button x:Name="btnTest" Content="asdf" Background="Transparent" MouseLeftButtonDown="btnTest_MouseLeftButtonDown"></Button> 
     </Canvas> 
    </UserControl> 

這裏是我的代碼

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void btnTest_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     btnTest.Content = DateTime.Now.ToString(); 
    } 

    private void LayoutRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     e.Handled = false; 
    } 
} 

我在做什麼錯?

回答

7

Button控制(或更具體地從它導出ButtonBase超類)處理,以產生該Click事件MouseLeftButtonDown事件本身。因此,您不能從標準Button獲得MouseLeftButtonDown事件。

有沒有原因您沒有使用Click事件?

+0

我有一個按鈕,作爲拖放手柄。我想要檢測用戶何時按下按鈕,然後我可以在MouseMove期間開始重新定位控件,然後停止在MouseUp事件上重新定位。我該怎麼做呢? – Matt

+0

@Matt:停止使用拖放控制按鈕?這真的取決於__why__你想要這個。例如,如果您正在創建某種UI構建器,則可以將該按鈕放置在一個網格中,該網格也具有覆蓋該按鈕的透明畫布。然後,您可以管理畫布上的事件。注意畫布和按鈕將是兄弟,該按鈕不會是畫布的子項。 – AnthonyWJones

+1

很酷。我最終爲我的按鈕創建了一個內容模板,然後在ControlTemplate元素上監聽MouseDown/MouseUp事件。 – Matt

4

如果用代碼添加處理程序是這樣的:

dgv.AddHandler(DataGrid.MouseLeftButtonDownEvent, new MouseButtonEventHandler(dgv_MouseLeftButtonDown), true); 
    dgv.AddHandler(DataGrid.MouseLeftButtonUpEvent, new MouseButtonEventHandler(dgv_MouseLeftButtonUp), true); 

,並確保你在最後一個參數傳遞true「HandledEventsToo」我想你會得到它的工作 - 我沒有...

0

您是否注意到單擊Silverlight按鈕時,MouseLeftButtonDown和MouseLeftButtonUp事件未被觸發?原因在於按鈕通過覆蓋OnMouseLeftButtonDown和OnMouseLeftButtonUp處理程序來處理這兩個事件。在OnMouseLeftButtonDown覆蓋中,會引發Click事件,並將MouseLeftButtonDown事件標記爲已處理,因此它不會在視覺樹中冒泡。 OnMouseLeftButtonUp覆蓋還將MouseLeftButtonUp標記爲已處理。

使用Button控件的ClickMode屬性可以更改此事。它有以下值 - 懸停,按,釋放。默認的是Pressed,我們已經解釋過了。當ClickMode設置爲Release時,Click事件將在OnMouseLeftButtonUp覆蓋中引發,並且MouseLeftButtonDown和MouseLeftButtonUp事件將再次在按鈕內處理。如果我們將ClickMode設置爲懸停,Click事件將通過MouseEnter事件引發,我們也可以使用鼠標按鈕事件。