【问题标题】:Another WPF/XAML Image in Button Event Trouble按钮事件故障中的另一个 WPF/XAML 图像
【发布时间】:2013-12-12 23:54:58
【问题描述】:

我整理了以下 XAML 代码,试图找出为什么 Click 事件仅在我单击 Button 内的 Image 或 TextBlock 内容时触发。 Button 中这些周围的区域不会触发点击事件:

<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 应用程序。

【问题讨论】:

    标签: wpf xaml events


    【解决方案1】:

    这是因为您的 StackPanel 上尚未设置背景属性。 WPF 只会在您点击了某些东西的情况下才注册您,如果确实有某些东西正在被渲染,这是设计使然,并且允许您为异常形状的按钮执行诸如添加几何图形等操作。如果您确实希望按钮的这些区域是透明的,请将 ControlTemplate 中 StackPanel 的背景属性设置为“透明”。

    【讨论】:

      【解决方案2】:

      您是否有理由要设置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>
      

      【讨论】:

      • 这是我正在试验的全景面板的 Sacha Barber 演示,只是尝试做一些事情,想知道为什么它们没有按预期工作。我仍在掌握控制模板。毫无疑问,我对此有很多疑问,但现在,将背景设置为透明对我来说如下。如果我从头开始写作,考虑到我对事物和其他经验的理解,我会这样做。我还没有接触过 WPF 中的 ControlTemplates。
      【解决方案3】:

      你应该试试这个..

      移除按钮的点击事件,使用边框的点击事件显示消息框。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        • 1970-01-01
        相关资源
        最近更新 更多