WinUI3 調整按鈕顏色

在 WinUI 3 上要修改 Button 的顏色非常簡單:
    
<Button Background="Green">這是一個按鈕</Button>
    

但是這只是修改游標移動上去前的顏色,游標移動上去後的顏色要怎麼修改呢?在 C# 的程式碼中找不到其他可以修改的屬性,完全不知道該怎麼做。在研究了很久很久之後...
    
<Button Background="Green">這是一個按鈕
    <Button.Resources>
        <SolidColorBrush
            x:Key="ButtonBackgroundPointerOver"
            Color="Red" />
    </Button.Resources>
</Button>
    

這是什麼鬼,我怎麼沒學過

找了半天,這些內容定義在:
    
%USERPROFILE%\.nuget\packages\microsoft.windowsappsdk\[版本]\lib\[版本]\Microsoft.WinUI\Themes\generic.xaml
    

筆者的實際路徑是:
    
C:\Users\ruyut\.nuget\packages\microsoft.windowsappsdk\1.5.240311000\lib\net6.0-windows10.0.18362.0\Microsoft.WinUI\Themes\generic.xaml
    

筆者擷取其中的一些內容:
    
            <SolidColorBrush x:Key="BackButtonBackgroundThemeBrush" Color="Transparent" />
            <SolidColorBrush x:Key="BackButtonDisabledForegroundThemeBrush" Color="#66FFFFFF" />
            <SolidColorBrush x:Key="BackButtonForegroundThemeBrush" Color="#FFFFFFFF" />
            <SolidColorBrush x:Key="BackButtonPointerOverBackgroundThemeBrush" Color="#21FFFFFF" />
            <SolidColorBrush x:Key="BackButtonPointerOverForegroundThemeBrush" Color="#FFFFFFFF" />
            <SolidColorBrush x:Key="BackButtonPressedForegroundThemeBrush" Color="#FF000000" />
            <SolidColorBrush x:Key="ButtonBackgroundThemeBrush" Color="Transparent" />
            <SolidColorBrush x:Key="ButtonBorderThemeBrush" Color="#FFFFFFFF" />
            <SolidColorBrush x:Key="ButtonDisabledBackgroundThemeBrush" Color="Transparent" />
            <SolidColorBrush x:Key="ButtonDisabledBorderThemeBrush" Color="#66FFFFFF" />
            <SolidColorBrush x:Key="ButtonDisabledForegroundThemeBrush" Color="#66FFFFFF" />
            <SolidColorBrush x:Key="ButtonForegroundThemeBrush" Color="#FFFFFFFF" />
            <SolidColorBrush x:Key="ButtonPointerOverBackgroundThemeBrush" Color="#21FFFFFF" />
            <SolidColorBrush x:Key="ButtonPointerOverForegroundThemeBrush" Color="#FFFFFFFF" />
            <SolidColorBrush x:Key="ButtonPressedBackgroundThemeBrush" Color="#FFFFFFFF" />
            <SolidColorBrush x:Key="ButtonPressedForegroundThemeBrush" Color="#FF000000" />
    

透過「英文閱讀測驗」找到上面可以使用的 Key 後,再修改自己的 Button 屬性,非常麻煩。

如果要在 C# 中動態指定的話:
    
var backgroundBrush = new Microsoft.UI.Xaml.Media.SolidColorBrush(Microsoft.UI.Colors.Red);
MyButton.Background = backgroundBrush;

var backgroundPointerOverBrush = new Microsoft.UI.Xaml.Media.SolidColorBrush(Microsoft.UI.Colors.YellowGreen);
MyButton.Resources["ButtonBackgroundPointerOver"] = backgroundPointerOverBrush;
    

又學到一課了...

參考資料:
StackOverflow - Where is the generic.xaml file located?
Microsoft.Learn - XAML theme resources
Microsoft.Learn - SolidColorBrush Class

留言