首页 > 解决方案 > WPF/C# MaterialDesignInXAML,如何将内容绑定到 controlTemplate 中的字符串

问题描述

当我想将按钮与 IconPack 一起使用时。

<Button Content="WindowMinimize" Style="{StaticResource WindowsControlButton}" />

像这样。并通过 controltemplate 改变样式

<Style TargetType="{x:Type Button}" x:Key="WindowsControlButton" BasedOn="{StaticResource BaseStyle}">
    <Setter Property="WindowChrome.IsHitTestVisibleInChrome" Value="True"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Padding" Value="8"/>
    <Setter Property="Width" Value="45"/>
    <Setter Property="VerticalAlignment" Value="Stretch"/>
    <Setter Property="Foreground" Value="{StaticResource ForegroundMainBrush}"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}">
                    <materialDesign:PackIcon Kind="{TemplateBinding Content}"/>                            // here !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="{StaticResource BackgroundLightBrush}"/>
        </Trigger>
    </Style.Triggers>
</Style>

我试过这个。但<materialDesign:PackIcon Kind="{TemplateBinding Content}"/>不符合我的期望。我该怎么做?请帮我。

我想使用按钮的内容更改 ControlTemplate 中的种类。_

标签: c#wpfmaterial-design-in-xaml

解决方案


PackIcon.Kind这里的问题是和之间类型的细微差别Button.Content。前者是枚举,而后者是通用对象。在 XAML 中,当您键入时,<materialDesign:PackIcon Kind="WindowMinimize"/>它能够确定字符串“WindowMinimize”需要转换为目标类型,PackIconKind因为它被应用于它的属性。将字符串转换为适当的目标类型的过程由类型转换器处理。

在 WPF 中, aButton派生自ContentControl所以Content属性只是一个泛型object. 因此,当您设置<materialDesign:PackIcon Kind="{TemplateBinding Content}"/>它时,它无法确定转换,因为 Content 可以是任何东西。它不知道如何将通用对象转换为枚举。因此,即使 Content 属性中有一个字符串,它也不会尝试将简单转换为目标枚举类型之外的任何操作,并且通用字符串不会转换为枚举。

有几个选项。

  • 正如上面的评论所建议的,您可以将枚举值显式设置为Content(类型应为MaterialDesignThemes.Wpf.PackIconKind)。这是有效的,因为它会尝试将Content属性中的值转换为PackIconKind.

<Button Content="{x:Static materialDesign:PackIconKind.WindowMinimize}" ... />

  • 您可以编写一个值转换器来转换值。这将要求您将绑定从 a 更改TemplateBinding为相对源绑定,如下所示:

<materialDesign:PackIcon Kind="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource YourConverter}}"/>


推荐阅读