c#WPF更改CheckBox的检查颜色

时间:2015-07-21 20:44:15

标签: c# wpf

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

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

有什么想法吗? Surly有一种方法可以直接改变检查颜色。我尝试使用谷歌搜索,但我找到的唯一解决方案是创建自己的复选框类。

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

我找到了一个答案

    <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>

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

2 个答案:

答案 0 :(得分:3)

不幸的是,WPF人员决定将复选框设置为 BEAST 来处理。如果你研究模板,检查本身实际上是一个“BulletChrome”控件。现在,问题是BulletChrome控件都是用C#编写的,而不是从外部可以自定义,而不是通过XAML,所以所有的笔和画笔都是硬编码的。你可以在Reflector或IlSpy中找到你在GlyphStroke和GlyphFill属性之后,这两个属性克隆内部硬编码画笔。

我必须做同样的事情,我最后只是使用ILSpy复制整个课程并修改它只是为了调整一些事情。

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

编辑:嗯,如果你愿意,可以用反射修改两个画笔。这比复制全班更容易:)。

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

编辑#2:顺便说一下,快速进行1或2行黑客会破坏动画,所以如果你关心那些,你需要走正确的路线:)。

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

答案 1 :(得分:0)

这和SledgeHammer对Bullet bs说的一样烦人。基本上,刷子是硬编码的,因此不是一个简单的解决方案。 话虽这么说,这是一个快速的1线黑客。这不会破坏我机器上的动画。

尽管如SledgeHammer指出的那样,有几种不同的状态。我会把它留给你来覆盖你需要的那些。这将进行基本检查。

jQuery(this).attr('id')

您还需要引用typeof(BulletChrome).GetRuntimeFields().Where(f => f.Name == "_commonCheckMarkFill").First().SetValue(null, new SolidColorBrush(Colors.Yellow)); 并加入PresentationFramework.Aero

Example on my machine

值得指出的是,这会影响每个using Microsoft.Windows.Themes;,并且可能(取决于您覆盖哪些画笔)CheckBox,因此根据您的需要,YMMV。但它符合你的要求。