Button和Grid的相同点击事件

时间:2014-06-07 12:32:28

标签: wpf button grid routed-events

我今天阅读了有关路由事件的信息,并尝试为普通按钮和自定义网格按钮提供相同的点击事件处理程序。 Stackpanel处理路由按钮单击事件,并调用相同的处理程序我从网格的mousedown事件中触发click事件。代码没有错误但没有按预期工作。 按钮单击会显示消息框,但使用鼠标单击网格不会执行任何操作。

<Window x:Class="RoutedEventPr.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="550" Width="525">

<StackPanel  Background="Transparent" Button.Click="Button_Click_1">

    <Grid Width="200" Height="100" Background="Aqua" MouseDown="Grid_MouseDown_1">
        <Ellipse StrokeThickness="4" Width="200" Height="100" Fill="Beige"/>           
        <TextBlock Text="Press" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>

    <Button x:Name="SureBtn" Content="Pause !" Width="200" Margin="0 10 0 0"/>

    <Image HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Height="200" Source="I://fancybtn.jpg"/>

    <Label Content="Start the game"/>

</StackPanel>

    private void Grid_MouseDown_1(object sender, MouseButtonEventArgs e)
    {
        RaiseEvent(new RoutedEventArgs(Button.ClickEvent, this));
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Are you sure !");
    }

2 个答案:

答案 0 :(得分:2)

Button.Click event是路由事件,冒泡策略设置为 Bubble

这意味着它会冒泡到视觉父级直到root,直到它被处理完毕。在你的情况下,你从Window中引发一个事件,所以它会从Window冒泡到它的父类,它是null。

您必须从StackPanel的子控件中引发事件,以便它可以冒泡到StackPanel

<强> XAML

<Grid x:Name="grid" Width="200" Height="100" Background="Aqua" 
      MouseDown="Grid_MouseDown_1">
    <Ellipse StrokeThickness="4" Width="200" Height="100" Fill="Beige"/>
    <TextBlock Text="Press" HorizontalAlignment="Center"
               VerticalAlignment="Center"/>
</Grid>

代码

private void Grid_MouseDown_1(object sender, MouseButtonEventArgs e)
{
    grid.RaiseEvent(new RoutedEventArgs(Button.ClickEvent, this));
}

答案 1 :(得分:0)

我做了以下更改,现在可以使用了。

private void Grid_MouseDown_1(object sender, MouseButtonEventArgs e)
{
    SureBtn.RaiseEvent(new RoutedEventArgs(Button.ClickEvent, this));
}