[英]Reuse ToggleButton-Style in WPF
我有以下ToggleButton样式:
<Style x:Key="GraphToggleButtonStyle" TargetType="ToggleButton">
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content">
<Setter.Value>
<Image Source="{StaticResource Graph}" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Content">
<Setter.Value>
<Image Source="{StaticResource Graph_Off}" />
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
我试图将其重复用于我的ToggleButtons(这是一个列表)-因此列表中的每个项目都有一个ToggleButton。 问题是,当我单击ToggleButton时,未被单击的按钮图标消失了。 只有我单击的按钮才能显示所需的图像...这种样式是否做错了?
我的ToggleButton的实现:
<ToggleButton Style="{StaticResource GraphToggleButtonStyle}"
ToolTip="{x:Static res:Resources.UseGraphToggle}"
Visibility="{Binding Selected,
Converter={StaticResource BoolToVisibilityConverter}}" />
每当按钮IsChecked
属性更改时,就不需要将子项(图像)添加到可视树中。
问题是样式默认情况下是共享的,除非您设置x:Shared="False"
并且第二,任何Visual只能添加到一个Visual树中 。 如果在另一棵可视树中添加Visual,它将从先前的可视树中删除。 在您的情况下,视觉效果是图像控件。
在您的情况下,可以使用x:Shared="False"
设置,但这会破坏资源的可重用性功能。 所以,我建议,而不是创建新实例Image
控制每次, 创建Image控件只有一次,在触发改变映像源 。
<Style x:Key="GraphToggleButtonStyle" TargetType="ToggleButton">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image x:Name="image"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsChecked,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=ToggleButton}}" Value="True">
<Setter TargetName="image" Property="Source"
Value="{StaticResource Graph}"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsChecked,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=ToggleButton}}" Value="False">
<Setter TargetName="image" Property="Source"
Value="{StaticResource Graph_Off}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
您风格的Image
是视觉效果。 一个视觉只能在视觉树中使用一次。 不要重复使用样式,而让WPF每次引用它时都创建一个新样式:
<Style x:Key="GraphToggleButtonStyle" TargetType="ToggleButton" x:Shared="False">
....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.