在WPF中重用ToggleButton-Style

时间:2014-03-22 04:16:36

标签: c# wpf xaml togglebutton

我有以下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}}" />

2 个答案:

答案 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">
....