通过样式将按钮的内容设置为<Image>

Rei*_*ini 7 wpf xaml styles image button

无法让这个工作:

<UserControl>
    <UserControl.Resources>
        <ResourceDictionary>
            <Style x:Key="TestStyle" TargetType="{x:Type Button}">
                <Setter Property="Button.Content">
                    <Setter.Value>
                        <Image Source="D:\Temp\dictionary16.png"/>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>
    <StackPanel VerticalAlignment="Top" HorizontalAlignment="Left">
        <Button Style="{StaticResource TestStyle}"/>
        <Button Style="{StaticResource TestStyle}"/>
    </StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

此代码抛出以下异常(指向第二个按钮):

指定的元素已经是另一个元素的逻辑子元素.首先断开它.

H.B*_*.B. 18

样式创建了一个实例Image,你不能在这样的两个地方使用它.您可以将图像创建为单独的资源,并在样式中引用它,然后将在使用样式的每个位置创建一个新图像.x:Shared= false


例如

<UserControl>
    <UserControl.Resources>
        <Image x:Key="img" x:Shared="false" Source="D:\Temp\dictionary16.png" />
        <Style x:Key="TestStyle" TargetType="{x:Type Button}">
            <Setter Property="Content" Value="{StaticResource img}" />
        </Style>
    </UserControl.Resources>
    <StackPanel VerticalAlignment="Top" HorizontalAlignment="Left">
        <Button Style="{StaticResource TestStyle}" />
        <Button Style="{StaticResource TestStyle}" />
    </StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

  • -1:这不是 WPF 中处理此问题的正确方法。在我的项目中尝试过,但没有成功,可能是因为代码位于外部 DLL 中。您应该通过 ContentTemplate 设置内容,这将确保为每个按钮创建一个新图像。 (2认同)

Rei*_*ini 11

昨天我发现了一个有类似问题的用户:WPF - 改变一个按钮的内容?

这篇文章让我解决了这个问题(因为stackoverflow的8小时限制而无法发布--.-)

<Setter Property="ContentTemplate">
    <Setter.Value>
        <DataTemplate>
            <Image Source="{mcWPF:LangRes imgSettings16, Bitmap}" Height="14"/>
        </DataTemplate>
    </Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)

不知道天气这比HB的解决方案更干净/更脏/更好