Silverlight 的 MouseLeftButtonDown 事件未触发

3

我可以让MouseEnter, MouseLeaveClick事件触发,但无法使MouseLeftButtonDownMouseLeftButtonUp事件触发。

这是我的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;
    }
}

我做错了什么吗?

3个回答

7
Button控件(或更具体地说,它继承自的ButtonBase超类)自己处理MouseLeftButtonDown事件以生成Click事件。因此,您无法从标准Button获取MouseLeftButtonDown事件。

您不使用Click事件的原因是什么?


我有一个作为拖放句柄的按钮。我想要检测用户何时按下按钮,以便在MouseMove期间开始重新定位我的控件,然后在MouseUp事件上停止重新定位。我应该怎么做? - Matt
@Matt:停止使用按钮作为拖放句柄?这真的取决于你为什么要这样做。例如,如果你正在创建某种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);

确保在最后一个参数 "HandledEventsToo" 中传递 true,我认为你会让它正常工作 - 我做到了...


0

你是否注意到在点击Silverlight按钮时,MouseLeftButtonDown和MouseLeftButtonUp事件不会被触发?原因是按钮通过重写OnMouseLeftButtonDown和OnMouseLeftButtonUp处理程序来自己处理这两个事件。在OnMouseLeftButtonDown重写中,会引发Click事件,并将MouseLeftButtonDown事件标记为已处理,因此它无法在可视树中冒泡。OnMouseLeftButtonUp重写也将MouseLeftButtonUp标记为已处理。

可以使用Button控件的ClickMode属性来更改此行为。它有以下值- Hover、Press、Release。默认值为Pressed,我们已经解释过了。当我们将ClickMode设置为Release时,在OnMouseLeftButtonUp重写中将引发Click事件,并且MouseLeftButtonDown和MouseLeftButtonUp事件将再次在按钮内部处理。如果我们将ClickMode设置为Hover,则Click事件将与MouseEnter事件一起引发,我们还可以使用鼠标按钮事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接