CheckBox IsChecked 未反映在 UI [WPF、XAML、C# 中

CheckBox IsChecked not reflecting in UI [WPF, XAML, C#]

所以我有这个自定义样式的 WPF 应用程序(但只是颜色和间距等)。 我的复选框在单击它们时有这种奇怪的行为,即 IsChecked 状态未在 UI 中表示。 单击 CheckBox 时,会出现单击动画,但不会出现勾号。 This is how it looks

这里是来自 Window 内容的示例:

<CheckBox Grid.Row="3" x:Name="CheckboxBattAlerts" VerticalAlignment="Center" IsChecked="False" IsThreeState="False"
          Content="{x:Static p:Resources.Option_BatteryAlerts}"
          Checked="CheckboxBattAlerts_CheckedChanged" Unchecked="CheckboxBattAlerts_CheckedChanged" />

CheckChanged处理方法:

private void CheckboxBattAlerts_CheckedChanged(object sender, RoutedEventArgs e)
{
    App.Current.BattAlertsEnabled = CheckboxBattAlerts.IsChecked ?? false;
}

IsChecked 正在按应有的方式更改。

也许这是因为样式,但在删除样式后我看不到任何变化。 (我把下面的代码注释掉了) 这是应用于 CheckBox 的 XAML 样式:

<Application.Resources>
    (...)
    <Style TargetType="{x:Type Control}">
        <Setter Property="Foreground" Value="{StaticResource TextBlockBrush}" />
        <Setter Property="Margin" Value="6,4" />
        <Setter Property="FontSize" Value="10pt" />
        <Setter Property="FontWeight" Value="Normal" />
        <Setter Property="FontFamily" Value="Bahnschrift SemiLight" />
    </Style>

    <Style TargetType="{x:Type CheckBox}">
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="Margin" Value="4,2"/>
    </Style>
</Application.Resources>

此外,当我将 Background="White" Foreground="Red" 添加到任何 CheckBox 时,没有任何变化。

我四处搜索,但我能找到的“解决方案”根本没有帮助。

那么,我错过了什么?有什么想法吗?

问题是您在黑色背景上使用默认 CheckBox。因此复选标记不可见。

要更改颜色,您必须覆盖默认模板。您可以在 Microsoft 文档中找到示例模板:CheckBox ControlTemplate Example。 您想要调整 "optionMark""indeterminateMark" 元素的颜色,以及触发器中定义的颜色(例如,鼠标悬停等):

<CheckBox IsChecked="False"
          HorizontalAlignment="Left">
  <CheckBox.Template>
    <ControlTemplate TargetType="{x:Type CheckBox}">
      <Grid x:Name="templateRoot"
            Background="Transparent"
            SnapsToDevicePixels="True">
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto" />
          <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Border x:Name="checkBoxBorder"
                Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"
                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                Margin="1"
                VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
          <Grid x:Name="markGrid">
            <Path x:Name="optionMark"
                  Data="F1 M 9.97498,1.22334L 4.6983,9.09834L 4.52164,9.09834L 0,5.19331L 1.27664,3.52165L 4.255,6.08833L 8.33331,1.52588e-005L 9.97498,1.22334 Z "
                  Fill="{TemplateBinding Foreground}"
                  Margin="1"
                  Opacity="0"
                  Stretch="None" />
            <Rectangle x:Name="indeterminateMark"
                        Fill="Gray"
                        Margin="2"
                        Opacity="0" />
          </Grid>
        </Border>
        <ContentPresenter x:Name="contentPresenter"
                          Grid.Column="1"
                          Focusable="False"
                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                          Margin="{TemplateBinding Padding}"
                          RecognizesAccessKey="True"
                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
      </Grid>
      <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver"
                  Value="true">
          <Setter Property="Background"
                  TargetName="checkBoxBorder"
                  Value="white" />
          <Setter Property="BorderBrush"
                  TargetName="checkBoxBorder"
                  Value="White" />
          <Setter Property="Fill"
                  TargetName="optionMark"
                  Value="Black" />
          <Setter Property="Fill"
                  TargetName="indeterminateMark"
                  Value="Black" />
        </Trigger>
        <Trigger Property="IsEnabled"
                  Value="false">
          <Setter Property="Background"
                  TargetName="checkBoxBorder"
                  Value="Gray" />
          <Setter Property="BorderBrush"
                  TargetName="checkBoxBorder"
                  Value="Gray" />
          <Setter Property="Fill"
                  TargetName="optionMark"
                  Value="Gray" />
          <Setter Property="Fill"
                  TargetName="indeterminateMark"
                  Value="Gray" />
        </Trigger>
        <Trigger Property="IsPressed"
                  Value="true">
          <Setter Property="Background"
                  TargetName="checkBoxBorder"
                  Value="White" />
          <Setter Property="BorderBrush"
                  TargetName="checkBoxBorder"
                  Value="White" />
          <Setter Property="Fill"
                  TargetName="optionMark"
                  Value="Black" />
          <Setter Property="Fill"
                  TargetName="indeterminateMark"
                  Value="Black" />
        </Trigger>
        <Trigger Property="IsChecked"
                  Value="true">
          <Setter Property="Opacity"
                  TargetName="optionMark"
                  Value="1" />
          <Setter Property="Opacity"
                  TargetName="indeterminateMark"
                  Value="0" />
        </Trigger>
        <Trigger Property="IsChecked"
                  Value="{x:Null}">
          <Setter Property="Opacity"
                  TargetName="optionMark"
                  Value="0" />
          <Setter Property="Opacity"
                  TargetName="indeterminateMark"
                  Value="1" />
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
  </CheckBox.Template>
</CheckBox>