C# 将xaml样式应用于按钮内容
如果这是一个愚蠢的问题,我道歉。看起来应该很容易,但我就是想不出怎么做。我有许多按钮,每个按钮都有一个图像和一个内容文本块。我正在尝试为按钮创建一种样式,以设置图像和文本块的属性 这是我到目前为止得到的 我认为:C# 将xaml样式应用于按钮内容,c#,wpf,xaml,styles,datatemplate,C#,Wpf,Xaml,Styles,Datatemplate,如果这是一个愚蠢的问题,我道歉。看起来应该很容易,但我就是想不出怎么做。我有许多按钮,每个按钮都有一个图像和一个内容文本块。我正在尝试为按钮创建一种样式,以设置图像和文本块的属性 这是我到目前为止得到的 我认为: <Button Command="{Binding TolerancesCommand}"> <StackPanel> <Image Source="{StaticResource DeviationIcon}"/>
<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”。您需要为样式指定一个键,并将数据模板更改为控件模板
<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>
图像和文本块的
绑定是导致问题的原因。现在,它们被绑定到默认值。您需要指定要将这些值绑定到什么,以获得所需的结果
这里有一些链接
如果您需要可重复使用的样式,您可以按照Bailey989的建议执行,如果您只想为一个按钮应用自定义内容,您可以应用以下代码:
<Button Command="{Binding TolerancesCommand}">
<Button.Content>
<StackPanel>
<Image Source="{StaticResource DeviationIcon}"/>
<TextBlock Text="Tolerances"/>
</StackPanel>
</Button.Content>
</Button>
对于图像,请确保图像已缩放。最好的方法是获取.svg格式的图像并将其转换为.xaml,然后将其添加到您的资源中并使用它。您将获得矢量图像,您可以将其缩放到您想要的大小,并且不会看到任何像素。问题的根源很清楚(尽管有四个不同的人对问题的原因做出了错误的猜测):您正在声明一个模板,该模板将应用于按钮的内容对象,但是您已经将该内容对象设置为
元素,而不是可以有效绑定到Image.Source
或TextBlock.Text
的元素(后者是提供
对象类型名称的元素)。不幸的是,不清楚你到底想发生什么。。。。。。为什么您认为将相同的值绑定到这两个属性(一个需要ImageSource
对象,另一个需要string
对象)是有意义的,这一点尚不清楚,如果没有良好的上下文,对于你真正想要的行为,甚至不可能做出任何合理的推断。每个按钮的图像都必须相同吗?不,问题的关键是,我希望每个按钮都有不同的图像和不同的文本,但能够给它们一个一致的风格。