2010-03-27 139 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事件引发,我们也可以使用鼠标按钮事件。