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