Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将xaml样式应用于按钮内容_C#_Wpf_Xaml_Styles_Datatemplate - Fatal编程技术网

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
对象)是有意义的,这一点尚不清楚,如果没有良好的上下文,对于你真正想要的行为,甚至不可能做出任何合理的推断。每个按钮的图像都必须相同吗?不,问题的关键是,我希望每个按钮都有不同的图像和不同的文本,但能够给它们一个一致的风格。