将 Image.Source 传递给 XAML 样式

dav*_*ove 2 wpf xaml

我正在尝试实现一个按钮样式,该样式具有使用该样式时指定的图像和标题。

这是我的风格:

<Style x:Key="ButtonStyle" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid Margin="0,0,0,0" Background="#FF9E9FA3">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Image Source="{TemplateBinding Tag}" Grid.Column="0"/>
                    <Label Content="{TemplateBinding Content}" Grid.Column="1" FontSize="15" VerticalAlignment="Center"/>
                </Grid>             
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

我这样使用它:

<Button Tag="edit.png" Content="Edit" Style="{StaticResource ButtonStyle}" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<Button Tag="save.png" Content="Save" Style="{StaticResource ButtonStyle}" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"/>
Run Code Online (Sandbox Code Playgroud)

内容按预期工作,两个按钮显示标签中的正确文字,但图像不显示。如果我直接使用 ControlTemplate(无样式)并将 {TemplateBinding} 替换为图像文件名,则图像确实会出现。

显然我使用了错误的标签或错误的图像。

帮助?

Cle*_*ens 6

如果你更换它就有效

<Image Source="{TemplateBinding Tag}" />
Run Code Online (Sandbox Code Playgroud)

经过

<Image Source="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}"/>
Run Code Online (Sandbox Code Playgroud)

因为这样就会自动执行从字符串到 ImageSource 的必要类型转换。