From fbee3293862dde9bb7a8be4010d0d299cc3ab745 Mon Sep 17 00:00:00 2001 From: Niels Laute Date: Thu, 25 Sep 2025 16:15:02 +0200 Subject: [PATCH 1/6] Lower the opacity of a BitmapIcon when card is Disabled --- .../SettingsControls/src/SettingsCard/SettingsCard.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/SettingsControls/src/SettingsCard/SettingsCard.cs b/components/SettingsControls/src/SettingsCard/SettingsCard.cs index dbc4f12e2..abf487386 100644 --- a/components/SettingsControls/src/SettingsCard/SettingsCard.cs +++ b/components/SettingsControls/src/SettingsCard/SettingsCard.cs @@ -228,6 +228,12 @@ private void OnIsClickEnabledChanged() private void OnIsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) { VisualStateManager.GoToState(this, IsEnabled ? NormalState : DisabledState, true); + + // The Disabled visual state will only set the right Foreground brush, but for images we need to lower the opacity so it looks disabled. + if (HeaderIcon is BitmapIcon && GetTemplateChild(HeaderIconPresenterHolder) is FrameworkElement headerIconPresenter) + { + headerIconPresenter.Opacity = IsEnabled ? 1 : 0.4; + } } private void OnActionIconChanged() From 243f478a3e6486ad7a7110e3ab882e76265aea06 Mon Sep 17 00:00:00 2001 From: Niels Laute Date: Sun, 28 Sep 2025 12:40:44 +0200 Subject: [PATCH 2/6] Using VisualStates vs codebehind --- .../SettingsControls/src/SettingsCard/SettingsCard.cs | 11 +++++++++-- .../src/SettingsCard/SettingsCard.xaml | 11 +++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/components/SettingsControls/src/SettingsCard/SettingsCard.cs b/components/SettingsControls/src/SettingsCard/SettingsCard.cs index abf487386..f514ba104 100644 --- a/components/SettingsControls/src/SettingsCard/SettingsCard.cs +++ b/components/SettingsControls/src/SettingsCard/SettingsCard.cs @@ -21,6 +21,9 @@ namespace CommunityToolkit.WinUI.Controls; [TemplateVisualState(Name = PressedState, GroupName = CommonStates)] [TemplateVisualState(Name = DisabledState, GroupName = CommonStates)] +[TemplateVisualState(Name = BitmapHeaderIconEnabledState, GroupName = CommonStates)] +[TemplateVisualState(Name = BitmapHeaderIconDisabledState, GroupName = CommonStates)] + [TemplateVisualState(Name = RightState, GroupName = ContentAlignmentStates)] [TemplateVisualState(Name = RightWrappedState, GroupName = ContentAlignmentStates)] [TemplateVisualState(Name = RightWrappedNoIconState, GroupName = ContentAlignmentStates)] @@ -38,6 +41,10 @@ public partial class SettingsCard : ButtonBase internal const string PressedState = "Pressed"; internal const string DisabledState = "Disabled"; + internal const string BitmapHeaderIconStates = "BitmapHeaderIconStates"; + internal const string BitmapHeaderIconEnabledState = "BitmapHeaderIconEnabled"; + internal const string BitmapHeaderIconDisabledState = "BitmapHeaderIconDisabled"; + internal const string ContentAlignmentStates = "ContentAlignmentStates"; internal const string RightState = "Right"; internal const string RightWrappedState = "RightWrapped"; @@ -230,9 +237,9 @@ private void OnIsEnabledChanged(object sender, DependencyPropertyChangedEventArg VisualStateManager.GoToState(this, IsEnabled ? NormalState : DisabledState, true); // The Disabled visual state will only set the right Foreground brush, but for images we need to lower the opacity so it looks disabled. - if (HeaderIcon is BitmapIcon && GetTemplateChild(HeaderIconPresenterHolder) is FrameworkElement headerIconPresenter) + if (HeaderIcon is BitmapIcon) { - headerIconPresenter.Opacity = IsEnabled ? 1 : 0.4; + VisualStateManager.GoToState(this, IsEnabled ? BitmapHeaderIconEnabledState : BitmapHeaderIconDisabledState, true); } } diff --git a/components/SettingsControls/src/SettingsCard/SettingsCard.xaml b/components/SettingsControls/src/SettingsCard/SettingsCard.xaml index 3d2e4dd3a..280caf7b4 100644 --- a/components/SettingsControls/src/SettingsCard/SettingsCard.xaml +++ b/components/SettingsControls/src/SettingsCard/SettingsCard.xaml @@ -109,6 +109,7 @@ 8 476 286 + 0.4