WPF 切换开关和触发器

本文关键字:触发器 开关 WPF | 更新日期: 2023-09-27 18:28:49

我有 2 个 ToggleSwitch,我一次只希望启用其中一个。因此,如果一个在另一个上,则关闭,反之亦然。我虽然我可以使用触发器来实现这一点,但我遇到了一些麻烦。

逻辑似乎按预期工作,但是只有您更改选中状态的第一个开关才能工作,例如,如果我首先切换 swich1,switch2 将切换相反的状态。但是,如果我切换开关 2,它不会切换开关 1。如果我启动应用程序并先切换开关 2,开关 1 将按预期切换。

这是 xaml:

    <controls:ToggleSwitch Name="Toggle1">
                    <controls:ToggleSwitch.Style>                           
                        <Style TargetType="controls:ToggleSwitch">
                            <Setter Property="FontSize" Value="22"/>
                            <Setter Property="FontFamily" Value="Segoe UI"/>
                            <Setter Property="Height" Value="30"/>
                            <Setter Property="Width" Value="Auto"/>
                            <Setter Property="VerticalAlignment" Value="Center"/>
                            <Setter Property="RenderTransform">
                                <Setter.Value >
                                    <ScaleTransform ScaleX="0.7" ScaleY="0.7" CenterY="5" />
                                </Setter.Value>
                            </Setter>
                            <!-- Here is the 'normal' default content -->
                            <Setter Property="IsChecked" Value="{Binding Path=CurrentGroup.IsDistributionGroup}"/>
                            <Style.Triggers>
                                <!-- Here is how we bind to another control's property -->
                                <DataTrigger Binding="{Binding IsChecked, ElementName=Toggle2}" Value="True">
                                    <!-- Here is the 'override' content -->
                                    <Setter Property="IsChecked" Value="False"/>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding IsChecked, ElementName=Toggle2}" Value="False">
                                     <!--Here is the 'override' content--> 
                                    <Setter Property="IsChecked" Value="True"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </controls:ToggleSwitch.Style>
                </controls:ToggleSwitch>

    <controls:ToggleSwitch Name="Toggle2">
                    <controls:ToggleSwitch.Style>
                        <Style TargetType="controls:ToggleSwitch">
                            <Setter Property="FontSize" Value="22"/>
                            <Setter Property="FontFamily" Value="Segoe UI"/>
                            <Setter Property="Height" Value="30"/>
                            <Setter Property="Width" Value="Auto"/>
                            <Setter Property="VerticalAlignment" Value="Center"/>
                            <Setter Property="RenderTransform">
                                <Setter.Value >
                                    <ScaleTransform ScaleX="0.7" ScaleY="0.7" CenterY="5" />
                                </Setter.Value>
                            </Setter>
                            <!-- Here is the 'normal' default content -->
                            <Setter Property="IsChecked" Value="{Binding Path=CurrentGroup.IsGroupAgents}"/>
                            <Style.Triggers>
                                <!-- Here is how we bind to another control's property -->
                                <DataTrigger Binding="{Binding IsChecked, ElementName=Toggle1}" Value="True">
                                    <!-- Here is the 'override' content -->
                                    <Setter Property="IsChecked" Value="False"/>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding IsChecked, ElementName=Toggle1}" Value="False">
                                    <!-- Here is the 'override' content -->
                                    <Setter Property="IsChecked" Value="True"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </controls:ToggleSwitch.Style>
                </controls:ToggleSwitch>

WPF 切换开关和触发器

您可以从代码隐藏中执行此操作,并使用 ToggleButton。 我不熟悉 ToggleSwitch。

        Toggle1.Checked += Toggle1_Checked;
        Toggle1.Unchecked += Toggle1_Unchecked;
        Toggle2.Checked += Toggle2_Checked;
        Toggle2.Unchecked += Toggle2_Unchecked;
    }
    private void Toggle2_Unchecked(object sender, RoutedEventArgs e)
    {
        Toggle1.IsChecked = true;
    }
    private void Toggle2_Checked(object sender, RoutedEventArgs e)
    {
        Toggle1.IsChecked = false;
    }
    private void Toggle1_Unchecked(object sender, RoutedEventArgs e)
    {
        Toggle2.IsChecked = true;
    }
    private void Toggle1_Checked(object sender, RoutedEventArgs e)
    {
        Toggle2.IsChecked = false;
    }

此外,在上面的代码中,不清楚每个切换开关的初始 Checked 值在哪里。 您是否最初在某个地方将一个设置为选中,另一个设置为取消选中? 不确定这是否能解决您的问题。

此外,您可以从可以重新设置样式的RadioButton中获得相同的行为,并支持通过GroupName进行分组,因此每个单选按钮都是互斥的。 它源自 ToggleButton。