c# - 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 中的种类。_
解决方案
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}}"/>
推荐阅读
- r - 我如何从 R 中的 rapidapi 连接到这个 API?
- java - java.lang.NoClassDefFoundError: antlr/collections/AST 设置配置时.all.transitive = false
- php - Laravel - 如何在视图(刀片)中传递值等于输入值的变量?
- swiftui - SwiftUI 发送一个变量进行转换
- scala - 使用 Scala Spark 在同一个 csv 文件中追加新表
- sql - pyodbc 和 SQL:根据列表或系列中是否存在值来选择行
- html - 替代区域地图/如何在网站上制作交互式图像
- kotlin - PasswordVisualTransformation 将输入键转换为星号
- python - 如果列的所有元素都为空,如何转换列数据类型?
- blazor-webassembly - Blazor WebAssembly 使用地址栏导航