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.

具体来说,需要如下所示:

正确的样子

最终看起来像这样(忽略色差):

不正确的样子

我之前看到过类似的问题,但解决方案使用了不同的方法(我不想创建自定义用户控件,除了这个之外,我的所有需求都包含在当前代码中,并且重写会很麻烦)。我只需要修复我Style的,以便TextBlock居中,Image居中并变小。

如何重新编写Style以更正按钮的外观?

4

4 回答 4

9

尝试这样的事情:

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>

您可能必须更改Height/Margin以适应您的需要ImageStyle

于 2013-04-03T13:00:47.690 回答
6

您的问题的解决方案可能是将您的 Image 和 TextBlock 样式移动到 ControlTemplate 的 Resource 部分。我不知道为什么,但我相信如果样式是内容演示者资源的一部分,它们就不在范围内。

于 2013-04-03T13:00:49.577 回答
1

我认为,如果您设置 Button 的 ContentTemplate 而不是 Content,它将起作用。

<Button Style="{StaticResource BigButton}">
    <Button.ContentTemplate>
        <DataTemplate>
          <StackPanel>
            <Image Source="Resources/icon_cancel.png" />
            <TextBlock>save</TextBlock>
          </StackPanel>
        </DataTemplate>
    </Button.ContentTemplate>
</Button>
于 2013-04-03T14:39:45.283 回答
0

使用 height 属性来修复图像高度让说 30(取决于您的要求)并使用 HorzontalAllignment 以文本块为中心它会正常工作

于 2013-04-03T12:07:43.303 回答