c# WPF 更改 CheckBox 的复选颜色

标签 c# wpf

 <CheckBox Background="White" IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}"/>

我需要更改支票的颜色。我认为 Forground 这样做是因为背景改变了背景颜色,但无济于事。

有什么想法吗?当然有一种方法可以直接改变格子颜色。我尝试用谷歌搜索这个,但我发现的唯一解决方案是创建我自己的复选框类。

更改CheckBox复选颜色的属性在哪里?

我找到了一个答案

    <Path Visibility="Collapsed"
      Width="7"
      Height="7"
      x:Name="CheckMark"
      SnapsToDevicePixels="False"
      StrokeThickness="2"
      Data="M 0 0 L 7 7 M 0 7 L 7 0">
  <Path.Stroke>
    <SolidColorBrush Color="{DynamicResource GlyphColor}" />
  </Path.Stroke>
</Path>

但这不起作用,因为我无法将其添加为子元素。即使有效,也会改变太多。我想要的只是带有黑色复选标记的白色背景。灰色的灰色看起来很糟糕。没有内置的方法来改变颜色吗?

最佳答案

不幸的是,WPF 人员决定让复选框成为一个BEAST来处理。如果您研究模板,则检查本身实际上是一个“BulletChrome”控件。现在的问题是 BulletChrome 控件全部用 C# 编写,根本无法从外部(不通过 XAML)进行自定义,因此所有笔和画笔都是硬编码的。您会发现使用 Reflector 或 IlSpy,您需要 GlyphStroke 和 GlyphFill 属性,并且这两个属性克隆内部硬编码画笔。

我必须做和你一样的事情,最后我只是使用 ILSpy 复制整个类并修改它只是为了调整一些东西。

这不是您希望的答案,但没有办法轻松覆盖此控件。

编辑:好吧,如果你愿意的话,你可以用反射来修改两个画笔。这比复制整个类更容易:)。

它是同类中的野兽,所以... BulletChrome.cs = 2262 行!

编辑 #2:顺便说一句,快速执行 1 或 2 行 hack 会破坏动画,因此如果您关心这些,则需要走正确的路线:)。

编辑#3:不要忘记复选标记有很多状态。悬停、按下、禁用等以及大量动画和过渡。因此,任何给你快速答案的人都不明白这个控件是如何组合在一起的。

关于c# WPF 更改 CheckBox 的复选颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549255/

相关文章:

c# - 如何检查是否使用 ConsoleKeyInfo 按下了 2 个可能的键中的任何一个?

c# - 按钮统一切换颜色

c# - 绑定(bind)在 WPF MVVM C#​​ 中不起作用

wpf - 如何在 ListBoxItem 上产生 Click 事件?

c# - 在哪里通过代码设置验证错误?

c# - 复杂类型的 HashSet 中的 ExceptWith

c# - 如何使 odp.net 12c 与其他 oracle 客户端一起工作

c# - 合并两个(或更多)PDF

wpf - 用于使用 WPF 选择多个文件的 OpenFileDialog

c# - 在使用 ItemsSource 之前,项目集合必须为空