wpf:无法识别左键单击

时间:2014-04-13 09:06:06

标签: c# wpf events mouseevent

我刚接触到WPF,当我学习了我遇到的奇怪问题的材料时。

我构建了一个按钮,包含带有文本块的图层,我想要识别用户点击“按钮本身,'第一','第二或'第三'的位置(我输出一条消息)。

enter image description here

一切正常,但当用户点击左键(只有中键或右键)时,按钮不会引发事件。

所以我的问题:为什么当我用鼠标左键按下按钮时我没有收到消息框(我收到带有其他鼠标按钮的消息框)?

XAML:

<Button Margin="145,152,144,102" Padding="5,5,5,5" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="Button_MouseDown" Height="57" Width="214">
    <WrapPanel>
        <WrapPanel HorizontalAlignment="Center" VerticalAlignment="Center"></WrapPanel>
        <TextBlock Foreground="Black" FontSize="24" MouseDown="TextBlockFirst_MouseDown" >First  </TextBlock>
        <TextBlock Foreground="Red" FontSize="24"   MouseDown="TextBlockSecond_MouseDown">Second </TextBlock>
        <TextBlock Foreground="Blue" FontSize="24"  MouseDown="TextBlockThird_MouseDown" >Third  </TextBlock>
    </WrapPanel>
</Button>

代码:

private void TextBlockFirst_MouseDown(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("You click on first");
}

private void TextBlockSecond_MouseDown(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("You click on second");
}

private void TextBlockThird_MouseDown(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("You click on third");
}

private void Button_MouseDown(object sender, MouseButtonEventArgs e)
{
    // This event not working good
    // only middle & right mouse buttons are recognized
    MessageBox.Show("You click on the button");
}

谢谢!

2 个答案:

答案 0 :(得分:14)

MouseDown 事件是一个 bubbling event ,它从其发起者到其根父母的气泡。但 Click 事件会占用 MouseDown 事件,并且不允许事件冒泡到Button。

您可以使用 PreviewMouseDown 事件,该事件是 tunnelling event ,它从根到其发起者进行隧道传输。因此按钮将首先获得此事件,然后是后续的textBlock。

<Button PreviewMouseDown="Button_MouseDown">
   .......
</Button>

请参阅下面的快照以获得清晰的图片:

enter image description here


<强>更新

仅在按钮上挂钩PreviewMouseDown事件,并从单个textBlock中删除处理程序。检查e.OrignialSource以查看TextBlock是否为实际原始来源或按钮。

private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    if (!(e.OriginalSource is TextBlock))
    {
        MessageBox.Show("You click on the button");
    }
    else
    {
        switch ((e.OriginalSource as TextBlock).Text)
        {
            case "First":
                MessageBox.Show("You click on first");
                break;
            case "Second":
                MessageBox.Show("You click on second");
                break;
            case "Third":
                MessageBox.Show("You click on third");
                break;
        }
    }
}

XAML

<Button PreviewMouseDown="Button_PreviewMouseDown" Height="57" Width="214">
    <WrapPanel>
        <WrapPanel HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <TextBlock Foreground="Black" FontSize="24">First</TextBlock>
        <TextBlock Foreground="Red" FontSize="24">Second</TextBlock>
        <TextBlock Foreground="Blue" FontSize="24">Third</TextBlock>
    </WrapPanel>
</Button>

答案 1 :(得分:2)

它不起作用,因为第一次触发是Button.Click处的事件,当它起作用时,它会与以下事件冲突:MouseLeftButtonDownMouseUp,{{ 1}}。

要生成此事件,您需要定义MouseDown事件,因为它是 PreviewMouseDown 事件,这意味着它将落在VisualTree层次结构中因此它在泡泡事件之前被触发。

此外,作为替代方案,您可以将Tunnel事件用于Button。