ChangePropertyAction 不影响 FontWeight
ChangePropertyAction does not affect FontWeight
在我的通用 Windows 平台应用程序中,我有一个 TextBlock
其 DataContext
是自定义 class:
<TextBlock Text="{Binding OpeningHourDescription}" FontWeight="Light">
...
</TextBlock>
我的习惯 class 有一个 属性 IsOpen
。如果为真,TextBlock
应该更改其颜色和字体粗细。我试图通过替换 TextBlock
元素中的以下 XAML 代码来定义它:
<Interactivity:Interaction.Behaviors>
<Core:DataTriggerBehavior Binding="{Binding IsOpen}" Value="true">
<Core:ChangePropertyAction PropertyName="Foreground" >
<Core:ChangePropertyAction.Value>
<Color>Lime</Color>
</Core:ChangePropertyAction.Value>
</Core:ChangePropertyAction>
<Core:ChangePropertyAction PropertyName="FontWeight">
<Core:ChangePropertyAction.Value>
<FontWeight>ExtraBold</FontWeight>
</Core:ChangePropertyAction.Value>
</Core:ChangePropertyAction>
</Core:DataTriggerBehavior>
</Interactivity:Interaction.Behaviors>
行为本身有效:如果 IsOpen
为真,则文本为绿色。但是,未设置 FontWeight
,文本从不显示为粗体。
奇怪的是,交换两个 ChangePropertyAction
导致两个操作都没有应用。
在 TextBlock
上静态更改 FontWeight
按预期工作。当 FontWeight="Light"
不是 而不是 时,也会出现此问题 TextBlock
.
我做错了什么?如何用 ChangePropertyAction
修改 FontWeight
?
如果你查看 Windows API,你会看到 TextBlock.FontWeight 属性 是 FontWeight
类型,它是一个结构包含 Int16.
public struct FontWeight
{
public System.UInt16 Weight;
}
如果在控件上设置 XAML 属性,它会设法将字符串转换为 FontWeights
静态 属性.
public sealed class FontWeights : IFontWeights
{
public static FontWeight Black { get; }
public static FontWeight Bold { get; }
public static FontWeight ExtraBlack { get; }
public static FontWeight ExtraBold { get; }
public static FontWeight ExtraLight { get; }
public static FontWeight Light { get; }
public static FontWeight Medium { get; }
public static FontWeight Normal { get; }
public static FontWeight SemiBold { get; }
public static FontWeight SemiLight { get; }
public static FontWeight Thin { get; }
}
但是在触发器中你声明你输入的字符串实际上是一个 FontWeight
结构(而不是 FontWeights
属性),因此系统有一个尝试转换字符串时出错。
<Core:ChangePropertyAction.Value>
<FontWeight>ExtraBold</FontWeight>
</Core:ChangePropertyAction.Value>
解决方案:您可以使用 GoToStateAction
和 VisualStates 来解决您的问题。
<TextBlock x:Name="MyTextBlock" Text="{Binding OpeningHourDescription}" FontWeight="Light">
<interactivity:Interaction.Behaviors>
<core:DataTriggerBehavior Binding="{Binding IsOpen}" Value="true">
<core:GoToStateAction StateName="Open" >
</core:GoToStateAction>
</core:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
</TextBlock>
并将正确的状态添加到您的容器控件中。
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="VisualStateGroup">
<VisualState x:Name="Open">
<VisualState.Setters>
<Setter Target="MyTextBlock.Foreground" Value="Lime" />
<Setter Target="MyTextBlock.FontWeight" Value="Bold" />
</VisualState.Setters>
</VisualState>
...
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
在我的通用 Windows 平台应用程序中,我有一个 TextBlock
其 DataContext
是自定义 class:
<TextBlock Text="{Binding OpeningHourDescription}" FontWeight="Light">
...
</TextBlock>
我的习惯 class 有一个 属性 IsOpen
。如果为真,TextBlock
应该更改其颜色和字体粗细。我试图通过替换 TextBlock
元素中的以下 XAML 代码来定义它:
<Interactivity:Interaction.Behaviors>
<Core:DataTriggerBehavior Binding="{Binding IsOpen}" Value="true">
<Core:ChangePropertyAction PropertyName="Foreground" >
<Core:ChangePropertyAction.Value>
<Color>Lime</Color>
</Core:ChangePropertyAction.Value>
</Core:ChangePropertyAction>
<Core:ChangePropertyAction PropertyName="FontWeight">
<Core:ChangePropertyAction.Value>
<FontWeight>ExtraBold</FontWeight>
</Core:ChangePropertyAction.Value>
</Core:ChangePropertyAction>
</Core:DataTriggerBehavior>
</Interactivity:Interaction.Behaviors>
行为本身有效:如果 IsOpen
为真,则文本为绿色。但是,未设置 FontWeight
,文本从不显示为粗体。
奇怪的是,交换两个 ChangePropertyAction
导致两个操作都没有应用。
在 TextBlock
上静态更改 FontWeight
按预期工作。当 FontWeight="Light"
不是 而不是 时,也会出现此问题 TextBlock
.
我做错了什么?如何用 ChangePropertyAction
修改 FontWeight
?
如果你查看 Windows API,你会看到 TextBlock.FontWeight 属性 是 FontWeight
类型,它是一个结构包含 Int16.
public struct FontWeight
{
public System.UInt16 Weight;
}
如果在控件上设置 XAML 属性,它会设法将字符串转换为 FontWeights
静态 属性.
public sealed class FontWeights : IFontWeights
{
public static FontWeight Black { get; }
public static FontWeight Bold { get; }
public static FontWeight ExtraBlack { get; }
public static FontWeight ExtraBold { get; }
public static FontWeight ExtraLight { get; }
public static FontWeight Light { get; }
public static FontWeight Medium { get; }
public static FontWeight Normal { get; }
public static FontWeight SemiBold { get; }
public static FontWeight SemiLight { get; }
public static FontWeight Thin { get; }
}
但是在触发器中你声明你输入的字符串实际上是一个 FontWeight
结构(而不是 FontWeights
属性),因此系统有一个尝试转换字符串时出错。
<Core:ChangePropertyAction.Value>
<FontWeight>ExtraBold</FontWeight>
</Core:ChangePropertyAction.Value>
解决方案:您可以使用 GoToStateAction
和 VisualStates 来解决您的问题。
<TextBlock x:Name="MyTextBlock" Text="{Binding OpeningHourDescription}" FontWeight="Light">
<interactivity:Interaction.Behaviors>
<core:DataTriggerBehavior Binding="{Binding IsOpen}" Value="true">
<core:GoToStateAction StateName="Open" >
</core:GoToStateAction>
</core:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
</TextBlock>
并将正确的状态添加到您的容器控件中。
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="VisualStateGroup">
<VisualState x:Name="Open">
<VisualState.Setters>
<Setter Target="MyTextBlock.Foreground" Value="Lime" />
<Setter Target="MyTextBlock.FontWeight" Value="Bold" />
</VisualState.Setters>
</VisualState>
...
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>