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>
所以我有这个自定义样式的 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>