我已经将以下XAML代码放在一起,试图找出为什么Click事件仅在我单击Button内的Image或TextBlock内容时触发。 Button中这些区域周围的区域不会触发click事件:
<Window x:Class="TestBedApp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel Orientation="Horizontal" Background="Bisque">
<Border BorderThickness="2" BorderBrush="Aqua">
<Button x:Name="btn" Click="btn_Click" Background="Olive">
<Button.Template>
<ControlTemplate>
<Border BorderThickness="2" BorderBrush="Red">
<StackPanel Orientation="Vertical">
<Image x:Name="img"
Source="Images/MyImage.png"
Width="100"
Height="72"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="10">
</Image>
<TextBlock Text="Click Me" Foreground="White"/>
</StackPanel>
</Border>
</ControlTemplate>
</Button.Template>
</Button>
</Border>
</StackPanel>
</Window>
代码背后:
private void btn_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Ooosh");
}
我使用ContentPresenters在网上看到了一些样本,但我正在解释这个问题。我对XAML非常陌生,只是让我的脚湿透了。我正在使用VS2013和.NET 4.5应用程序。
答案 0 :(得分:2)
这是因为您的StackPanel上尚未设置background属性。 WPF只会注册你点击的东西,如果有实际的东西被渲染,这是设计的,并允许你做一些事情,如添加几何等异常形状的按钮。如果您确实希望按钮的这些区域是透明的,那么将ControlTemplate中StackPanel的background属性设置为“Transparent”。
答案 1 :(得分:0)
您是否有理由设置ControlTemplate
?如果主要目的是在Button
或其他元素中获取图像,您可以简单地将其添加为子项:
<StackPanel Orientation="Horizontal" Background="Bisque">
<Border BorderThickness="2" BorderBrush="Aqua">
<Button x:Name="btn" Click="btn_Click" Background="Olive">
<Border BorderThickness="2" BorderBrush="Red">
<StackPanel Orientation="Vertical">
<Image x:Name="img"
Source="Images/MyImage.png"
Width="100"
Height="72"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="10">
</Image>
<TextBlock Text="Click Me" Foreground="White"/>
</StackPanel>
</Border>
</Button>
</Border>
</StackPanel>
答案 2 :(得分:0)
你应该试试这个..
删除按钮的点击事件,并使用边框的点击事件显示消息框。