我今天阅读了有关路由事件的信息,并尝试为普通按钮和自定义网格按钮提供相同的点击事件处理程序。 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 !");
}
答案 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));
}