繁体   English   中英

在WPF中重用ToggleButton样式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM