使用图像+文本样式化WPF按钮

10

在我的C# / WPF / .NET 4.5应用程序中,我有带有图像的按钮,我是按照以下方式实现的:

<Button Style="{StaticResource BigButton}">
  <StackPanel>
    <Image Source="Images/Buttons/bt_big_save.png" />
    <TextBlock>save</TextBlock>
  </StackPanel>
</Button>

我有一个资源字典 UIStyles.xaml,其中我声明了以下内容:

<Style TargetType="Button" x:Key="BigButton">
  <Setter Property="Cursor" Value="Hand" />
  <Setter Property="Height" Value="80" />
  <Setter Property="Width" Value="80" />
  <Setter Property="Foreground" Value="White" />
  <Setter Property="FontWeight" Value="Bold" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <Border x:Name="border" 
            CornerRadius="5" 
            Background="#FF415360">
          <ContentPresenter x:Name="ButtonContentPresenter"
              VerticalAlignment="Center"  
              HorizontalAlignment="Center">
            <ContentPresenter.Resources>
              <Style TargetType="TextBlock">
                <Setter Property="TextAlignment" Value="Center" />
              </Style>
              <Style TargetType="Image">
                <Setter Property="Width" Value="10" />
                <Setter Property="Margin" Value="10" />
              </Style>
            </ContentPresenter.Resources>
          </ContentPresenter>
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

光标、高度、边框等属性都可以正常工作,但我无法样式化 TextBlockImage

具体来说,需要像这样呈现:

correct look

结果看起来像这样(忽略颜色差异):

incorrect look

我之前看过类似的问题,但解决方案使用了不同的方法(我不想创建自定义用户控件,除了这一个需求,我的全部需求都在当前代码中得到覆盖,重新编写将是一种麻烦)。我只需要修复我的Style,使TextBlock居中,Image缩小并居中即可。

我该如何重新编写Style以纠正按钮的外观?

4个回答

11

试试这样的代码:

Button 按钮:

<Button Style="{StaticResource BigButton}" Content="save">
    <Button.Tag>
        <ImageSource>../GreenLamp.png</ImageSource>
    </Button.Tag>
</Button>

样式Style

<Style TargetType="Button" x:Key="BigButton">
    <Setter Property="Cursor" Value="Hand" />
    <Setter Property="Height" Value="80" />
    <Setter Property="Width" Value="80" />
    <Setter Property="Foreground" Value="White" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border x:Name="border"
                        CornerRadius="5"
                        Background="#FF415360">
                    <StackPanel>
                        <Image Source="{TemplateBinding Tag}" 
                                VerticalAlignment="Top"
                                HorizontalAlignment="Center"
                                Height="50"
                                Margin="5" />
                        <ContentPresenter x:Name="ButtonContentPresenter"
                                        VerticalAlignment="Center"
                                        HorizontalAlignment="Center">
                    </ContentPresenter>
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

您可能需要更改Style中的ImageHeight/Margin以适应您的需求。


6

解决您的问题可能是将图像和文本块的样式移动到控件模板的资源部分。我不确定为什么,但我认为如果它们是内容呈现器的资源的一部分,那么样式就不在范围内。


1
这是正确的,<ContentPresenter.Resources> 中的样式没有被应用。将它们移动到 <ControlTemplate.Resources> 中可以使 UI 看起来符合预期。 - Rachel

1
我认为,如果您设置按钮的ContentTemplate而不是Content,它将起作用。
<Button Style="{StaticResource BigButton}">
    <Button.ContentTemplate>
        <DataTemplate>
          <StackPanel>
            <Image Source="Resources/icon_cancel.png" />
            <TextBlock>save</TextBlock>
          </StackPanel>
        </DataTemplate>
    </Button.ContentTemplate>
</Button>

0
使用height属性将图像高度固定为30(根据您的要求),并使用HorzontalAllignment将文本块居中。它会很好地工作。

很不幸,它并没有。 - mbaytas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接