通过样式将Button的内容设置为<img/>

时间:2011-06-15 11:11:53

标签: wpf image xaml button styles

无法让它发挥作用:

<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>

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

  

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

2 个答案:

答案 0 :(得分:18)

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


e.g。

<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>

答案 1 :(得分:11)

昨天我发现了一个有类似问题的用户:WPF - Change a button's content in a style?

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

<Setter Property="ContentTemplate">
    <Setter.Value>
        <DataTemplate>
            <Image Source="{mcWPF:LangRes imgSettings16, Bitmap}" Height="14"/>
        </DataTemplate>
    </Setter.Value>
</Setter>

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