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>
您可以从代码隐藏中执行此操作,并使用 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。