繁体   English   中英

c#WPF更改复选框的检查颜色

[英]c# WPF Change the check color of a CheckBox

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

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

有任何想法吗? 当然,有一种方法可以直接更改检查颜色。 我尝试使用谷歌搜索,但发现的唯一解决方案是制作自己的复选框类。

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

但这不起作用,因为我无法将其添加为子元素。 即使有效,它也会改变太多。 我要的只是带有黑色对勾的白色背景。 灰色上的灰色看起来很糟糕。 是否有内置的方式可以更改颜色?

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

我必须做与您相同的事情,最后我只是使用ILSpy复制了整个类,然后对其进行了修改以进行一些调整。

这不是您希望的答案,但是没有一种方法可以轻松地覆盖此控件。

编辑:好吧,如果需要,您可以用反射修改两个画笔。 然后将整个类复制出来很容易:)。

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

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

编辑#3:别忘了复选标记有很多状态。 悬停,按下,禁用等,还有许多动画和过渡。 因此,任何为您提供快速解答的人都不会理解此控件的组合方式。

就像SledgeHammer在Bullet bs上所说的那样令人讨厌。 基本上,笔刷是硬编码的,所以没有一个简单的解决方案。 话虽如此,这是一个快速的1行技巧。 这不会破坏我机器上的动画。

但是,正如SledgeHammer指出的那样,有几种不同的状态。 我将由您决定是否需要覆盖哪些内容。 这将进行基本检查。

typeof(BulletChrome).GetRuntimeFields().Where(f => f.Name == "_commonCheckMarkFill").First().SetValue(null, new SolidColorBrush(Colors.Yellow));

您还必须引用PresentationFramework.Aero并包括using Microsoft.Windows.Themes;

我机器上的例子

值得指出的是,这将影响每个CheckBox ,并可能(取决于覆盖的画笔) RadioButton ,因此会取决于您的需要YMMV。 但这确实满足您的要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM