我有以下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时,未点击的按钮图标会消失。只有我点击的按钮才能显示所需的图像......我是否对这种风格做错了?
My ToggleButton-Implementation:
<ToggleButton Style="{StaticResource GraphToggleButtonStyle}"
ToolTip="{x:Static res:Resources.UseGraphToggle}"
Visibility="{Binding Selected,
Converter={StaticResource BoolToVisibilityConverter}}" />
答案 0 :(得分:3)
只要按钮IsChecked
属性发生变化,您就不需要将子(Image)添加到Visual Tree中。
问题是默认共享样式,除非您设置 x:Shared="False"
,其次 Visual只能在一个Visual树中添加。如果在另一个Visual树中添加Visual,它将从以前的Visual树中删除。您的案例中的视觉是图像控制。
在您设置的情况下,设置 x:Shared="False"
会有效,但这会破坏资源的可重用性。所以,我建议不要每次都创建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>
答案 1 :(得分:2)
你风格的Image
是视觉效果。一个视觉效果只能在视觉树中使用一次。 WPF不是重复使用样式,而是每次引用它时都会创建一个新的:
<Style x:Key="GraphToggleButtonStyle" TargetType="ToggleButton" x:Shared="False">
....