将xaml样式应用于按钮内容

时间:2017-07-24 14:21:16

标签: c# wpf xaml styles datatemplate

如果这是一个愚蠢的问题,请道歉。看起来应该很容易,但我想不出怎么做。我有许多按钮,每个按钮都有一个图像和一个内容的文本块。我正在尝试为按钮创建样式以在图像和文本块上设置属性。

这是我到目前为止所得到的。

在我看来:

<Button Command="{Binding TolerancesCommand}">
    <StackPanel>
        <Image Source="{StaticResource DeviationIcon}"/>
        <TextBlock Text="Tolerances"/>
    </StackPanel>
</Button>

在我的资源词典中:

 <Style TargetType="Button">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Margin" Value="{StaticResource DefaultMargin}"/>
    <Setter Property="BorderBrush" Value="{StaticResource NavButtonBorderBrush}"/>
    <Setter Property="BorderThickness" Value="2"/>
    <Setter Property="Height" Value="Auto"/>
    <Setter Property="Width" Value="{StaticResource NavButtonWidth}"/>
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel>
                    <Image Source="{Binding}" Height="20" Width="20"/>
                    <TextBlock Text="{Binding}" Foreground="Green"/>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

具体来说,我想在样式中设置图像的高度和宽度,而不是必须在每个按钮上单独设置它。

更新

为了清楚起见,风格正在应用中。在上面的示例中,按钮文本为textblock前景属性中设置的绿色。问题是我无法显示图像。按钮显示但其内容只是文本“System.Windows.Controls.StackPanel”。

3 个答案:

答案 0 :(得分:0)

图片和文本块的url.split('/')[-1] 是造成问题的原因。现在他们被绑定到默认值。您需要指定要绑定的值,以获得所需的结果。

这里有一些链接

MSDN

WPF Tutorial

答案 1 :(得分:0)

如果您需要可重复使用的样式,您可以按照Bailey_989的建议进行操作,如果您只想为一个按钮应用自定义内容,则可以应用此代码:

<Button Command="{Binding TolerancesCommand}">
    <Button.Content>
        <StackPanel>
            <Image Source="{StaticResource DeviationIcon}"/>
            <TextBlock Text="Tolerances"/>
        </StackPanel>
    </Button.Content>
</Button>

对于图像,请确保缩放图像。最好的方法是获取.svg格式图像,然后将其转换为.xaml,然后将其添加到您的资源并使用它。您将获得矢量图像,您可以根据需要将其缩放,并且不会显示任何像素。

答案 2 :(得分:-1)

您需要为该样式指定一个Key,并将数据模板更改为控件模板

<Style x:Key="MyButtonStyle" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                ...
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后按下按钮:

<Button Style="{StaticResource MyButtonStyle}" Command="{Binding TolerancesCommand}">
...
</Button>

另外,请确保您的资源字典已添加到App.xaml类中的应用程序资源中:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/AssemblyName;component/FolderName/Dictionary.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>