c# - 如何在重新启用后保持 ToggleButton 状态

标签 c# wpf-controls

我想在重新启用 ToggleButton 后保留 ToggleButton 的状态。但是它一直处于关闭状态。
这是椭圆激活时我的切换按钮:

enter image description here

当 ToggleLock 打开时:

enter image description here

解锁后:

enter image description here

颜色不对,必须变成绿色。
我的代码和风格:

<!--EllipseToggleButton Style-->
<Style TargetType="ToggleButton"
  x:Key="EllipseToggleButton"> 
  <Setter Property="Margin"
  Value="20 10 0 10" />
  <Setter Property="Height"
  Value="30" />
  <Setter Property="VerticalAlignment"
  Value="Top" />
  <Setter Property="IsTabStop"
  Value="False" />
  <Setter Property="FocusVisualStyle"
  Value="{x:Null}" />
  <Setter Property="Template">
  <Setter.Value>
  <ControlTemplate TargetType="{x:Type ToggleButton}">
   <Grid Name="contain">
   <VisualStateManager.VisualStateGroups>
   <VisualStateGroup x:Name="CommonStates">
   <VisualState x:Name="Normal" />
   <VisualState x:Name="Disabled">
   <Storyboard>
   <ColorAnimation Storyboard.TargetName="icon"
   Storyboard.TargetProperty="(Path.Fill).(Color)"
   To="#3D727272"
   Duration="0" />
   </Storyboard>
   </VisualState>
   </VisualStateGroup>
   <VisualStateGroup x:Name="CheckedStates">
   <VisualState x:Name="Checked">
   <Storyboard>
   <ColorAnimation x:Name="IconCheckedColorAni"
   Storyboard.TargetName="icon" Duration="0"
   Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
   To="#FF68E80F" />
   </Storyboard>
   </VisualState>
   <VisualState x:Name="Unchecked" />
   </VisualStateGroup>
   </VisualStateManager.VisualStateGroups>
   <Ellipse Name="icon"
   Height="24"
   Width="24"
   Stretch="Uniform"
   VerticalAlignment="Center"
   Cursor="Hand"
   Fill="{TemplateBinding Background}" />
   </Grid>
  </ControlTemplate>
  </Setter.Value>
  </Setter>
</Style>

主窗口:

<StackPanel Orientation="Horizontal">
  <ToggleButton x:Name="ToggleLock"
  Content="Lock"
  Width="100"
  Margin="20 10 0 10"
  VerticalAlignment="Top"
  Height="30" />
  <ToggleButton Style="{StaticResource EllipseToggleButton}"
  IsEnabled="{Binding ElementName=ToggleLock, Path=IsChecked, Converter={StaticResource InBConv}}"
  Background="Red" />
</StackPanel>

转换器:

class InvertBoolConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    if (value != null && value is bool)
    {
      return !(bool)value;
    }
    return false;
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    throw new NotImplementedException();
  }
}

最佳答案

ToggleButton 在禁用时会保留其 IsChecked 值。然而,当它重新启用时,视觉效果不匹配:当您取消切换锁定时,您会激活 CommonStates.Normal 视觉状态组,据我所知,它会重置名为 iconEllipse 上的默认值:

Fill="{TemplateBinding Background}"

...使其变红。您会发现需要单击省略号两次才能使其再次变为绿色。

由于省略号切换按钮不会更改其 IsChecked 值,因此不会调用 CheckedStates 视觉状态 Storyboard。

我还没有找到任何方法在 XAML 中修复此问题(尝试重新排序触发器、显式写出所有状态等),但您可以通过强制 IsChecked 状态更改来解决此问题隐藏代码:

<StackPanel Orientation="Horizontal">
    <ToggleButton x:Name="ToggleLock"
        Content="Lock"
        Width="100"
        Margin="20 10 0 10"
        VerticalAlignment="Top"
        Height="30"
        Checked="OnChecked"
        Unchecked="OnChecked" />
    <ToggleButton
        x:Name="toggleButton"
        Style="{StaticResource EllipseToggleButton}"
        IsEnabled="{Binding ElementName=ToggleLock, Path=IsChecked, Converter={StaticResource InBConv}}"
        Background="Red" />
</StackPanel>

...使用以下事件处理程序:

private void OnChecked(object sender, RoutedEventArgs e)
{
    bool? isChecked = this.toggleButton.IsChecked;
    toggleButton.IsChecked = null;
    toggleButton.IsChecked = isChecked;
}

我不知道这是最好的解决方案,但它确实有效,并且可以作为进一步调查的起点。

关于c# - 如何在重新启用后保持 ToggleButton 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40976182/

相关文章:

wpf - WPF中的分段文本框

c# - 如何在表单中模拟按钮按下的视觉效果?

WPF TextBlock 与 <LineBreak/> 绑定(bind)

c# - Asp.net调用C#层调用Managed C++调用Native C++

c# - 是否存在在 Project Server 中分配、更改或删除资源时引发的事件处理程序?

c# - 将一个 Kinect for Windows 用于两个并行进程

c# - 如何在 gridview 中显示余额日志

c# - BindingSource,设置数据源,然后设置一个新的数据源

WPF 扩展工具包向导验证