【问题标题】:WPF: How do I create a button "template" that applies a style & has an image in it?WPF:如何创建一个按钮“模板”来应用样式并在其中包含图像?
【发布时间】:2011-01-08 06:38:17
【问题描述】:

在我的 WPF 应用程序中有多个地方我需要一个看起来和感觉都像普通按钮的按钮,但是:

  1. 上面显示一个特定的图标(定义为{StaticResource EditIcon}
  2. 它应用一种样式(定义为{StaticResource GrayOutButtonStyle}

我更愿意在单个位置定义这些属性,而不是在每个使用按钮的地方重复它们。 在 XAML 中执行此操作的适当方法是什么?

--

如果有帮助,以下是我目前正在做的事情,但有人告诉我这是错误的:

更新:这是错误的方式吗?有没有办法解决这个问题,使它成为“正确的方法”?

我将按钮定义为模板,键为EditButton

<ControlTemplate x:Key="EditButton" TargetType="{x:Type Button}">
     <Button Style="{StaticResource GrayOutButtonStyle}" 
             Command="{TemplateBinding Command}">
        <Image x:Name="editImage" Source="{StaticResource EditIcon}" />
     </Button>
</ControlTemplate>

然后,我用模板 EditButton 声明一个按钮,我想在应用程序中的每个地方使用它。我还在这里指出要调用的命令:

<Button Template="{StaticResource EditButton}" Command="..." />

这不对吗?这样做的正确方法是什么?

【问题讨论】:

标签: wpf xaml button styles controltemplate


【解决方案1】:

您可以创建一个针对您应用的所有按钮的样式。这样做,只需创建一个 Style 而不给它一个 Key:

<Style TargetType={x:Type Button}>
</Style>

然后在 Style 中,你可以添加一个 setter 来设置 Template 属性:

<Setter Property="Template">
  <Setter.Value>
    <!-- whatever you want -->
  </Setter.Value>
</Setter>

【讨论】:

  • 如何使用样式在按钮上显示图像并说它应该包含 GrayOutButtonStyle?
  • 您可以更改 ControlTemplate 以在树中的某处包含图像。例如,您可以使用具有 2 列的网格,将图像放在第一列,将 ContentPresenter 放在第二列。
【解决方案2】:

另一种方法:

您是否考虑过制作自定义控件?这样,您可以创建自己的属性来设置按钮中包含的图像,而不必依赖多种样式。

<myControl:MyButton x:Name="oneButton" ImageSource="MyButton.png" />
<myControl:MyButton x:Name="anotherButton" ImageSource="MyOtherButton.png" />

class MyButton {

  private string imageSource;
  public string ImageSource {
    get {
      return this.imageSource;
    }
    set {
      this.imageSource = value;
      //set the image control's source to this.imageSource
    }
  }
}

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多