使用样式将按钮的内容设置为<Image>

7

无法使此功能正常运作:

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

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

指定元素已经是另一个元素的逻辑子级。请先断开连接。


您也可以使用附加属性来创建图像按钮。 - Navid Rahmani
是的,但如果我理解正确的话,我需要使用一些C#代码,如果可能的话,我想要一些纯WPF/XAML解决方案。 - Reini
2个回答

19

例如:

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

你能在你的回答中提供更多的代码吗? <ResourceDictionary.MergedDictionaries> <ResourceDictionary> <Image Source="D:\Temp\dictionary16.png" x:Key="TestImage" x:Shared="true"/> </ResourceDictionary> <ResourceDictionary> <Style x:Key="TestStyle" TargetType="{x:Type Button}"> <Setter Property="Content" Value="{StaticResource TestImage}"/> </Style> </ResourceDictionary> </ResourceDictionary.MergedDictionaries> 这是我理解的方式,但它最终会导致相同的异常。 - Reini
2
-1: 这不是在WPF中处理此问题的正确方式。我在我的项目中尝试过,但没有工作,可能因为代码在外部DLL中。相反,您应该通过ContentTemplate设置内容,这将确保为每个按钮创建新图像。 - reSPAWNed
@reSPAWNed:没有“正确”的方法。如果你没能让它工作,那是你自己的问题。此外,在许多控件不允许进行广泛模板化的情况下,这是唯一的方法使其正常工作。 - H.B.
@H.B.:收到。解决问题有很多方法,但我认为使用ContentTemplate的解决方案是更好或更符合WPF的方式来解决问题。我能确定的是,你的解决方案在我的情况下不起作用,这可能是因为代码位于一个单独的DLL中的UserControl中。 - reSPAWNed
@reSPAWNed:嗯,我已经在对Reini回答的评论中承认这种情况下模板解决方案更可取了,我只是认为你的负评可能是没有必要的... - H.B.
显示剩余2条评论

11

昨天我在stackoverflow上找到了一个有类似问题的用户:WPF - 如何在样式中更改按钮的内容?

这篇帖子让我得出了这个解决方案(不能发布是因为stackoverflow的8小时限制 -.-)

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

不知道这个解决方案是更干净、更繁琐还是比H.B.的解决方案更好。


那样更简洁,我建议尽可能使用模板属性。 - H.B.
+1:标记的答案在我的情况下不起作用,但这个解决方案可以...更清晰、更好的解决方案。 - reSPAWNed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接