c# - 在 WPF 中重用 ToggleButton 样式

标签 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 时,未单击的按钮图标消失了。只有我点击的按钮显示所需的图像...我这种风格做错了什么吗?

我的 ToggleButton 实现:

 <ToggleButton Style="{StaticResource GraphToggleButtonStyle}"
               ToolTip="{x:Static res:Resources.UseGraphToggle}"
               Visibility="{Binding Selected,
               Converter={StaticResource BoolToVisibilityConverter}}" />

最佳答案

每当按钮 IsChecked 属性发生更改时,您都不需要将子项(图像)添加到可视化树中。

问题是默认情况下共享样式,除非您设置x:Shared="False"并且其次任何视觉都可以仅添加到一棵可视化树中。如果您在另一个可视化树中添加可视化,它将从先前的可视化树中删除。在你的例子中,视觉是图像控制。

在您的情况下,设置 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>

关于c# - 在 WPF 中重用 ToggleButton 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22573390/

相关文章:

c# - IF Statement 多个条件,同一条语句

c# - 通过 MSMQ 进行通信的 Windows 服务 - 我需要服务总线吗?

javascript - 复选框和点击事件处理

wpf - 如果 Prism 模块崩溃会怎样?应用还稳定吗?

xaml - 在 ListView MVVM 中绑定(bind)复选框

xaml - 在 ContentView 中声明转换器会导致空白的 xamarin 表单页面

c# - .net Core - 具有自定义默认文件定义的静态文件

wpf - WCF/WPF 最佳实践 - WCF ChannelFactory 和 PRISM

c# - WPF C# - 窗口 Chrome 调整重叠按钮的大小

c# - 我在哪里可以找到 WPF 应用程序中 UI 的一些主题/演示?