Best way to override colours for controls? #458
Replies: 6 comments
-
<ui:ThemeResources>
<ui:ThemeResources.ThemeDictionaries>
<ResourceDictionary x:Key="Dark">
</ResourceDictionary>
</ui:ThemeResources.ThemeDictionaries>
</ui:ThemeResources>
<ResourceDictionary x:Key="Dark">
<ResourceDictionary.MergedDictionaries>
<ui:DefaultThemeResources Key="Dark" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
<ResourceDictionary.MergedDictionaries>
<ui:DefaultThemeResources Key="Dark" />
</ResourceDictionary.MergedDictionaries>
<ui:StaticResource x:Key="ButtonBorderBrush" ResourceKey="SystemControlBackgroundBaseMediumHighBrush" />
</ResourceDictionary> Currently this doesn't seem to take effect at design time, but does work at run time. And usually you'll need to override the brushes used by other states (such as |
Beta Was this translation helpful? Give feedback.
-
Thank you. On more question if I may. If I want to create a new colour that is derived from the accent colour, e.g. if none of the resource accent colours are exactly the right shade, is there an easy way to derive one? BTW thanks for you work on this library. It is really really helpful, especially ContentDialog. |
Beta Was this translation helpful? Give feedback.
-
Glad to hear it's of help. Regarding the question, unfortunately there’s no built-in way to do this. For a starter something like this might work for simple scenarios: public static class SolidColorBrushHelper
{
public static readonly DependencyProperty NegativeColorProperty =
DependencyProperty.RegisterAttached(
"NegativeColor",
typeof(Color),
typeof(SolidColorBrushHelper),
new PropertyMetadata(Colors.Transparent, OnNegativeColorChanged));
public static Color GetNegativeColor(SolidColorBrush brush)
{
return (Color)brush.GetValue(NegativeColorProperty);
}
public static void SetNegativeColor(SolidColorBrush brush, Color value)
{
brush.SetValue(NegativeColorProperty, value);
}
private static void OnNegativeColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var brush = (SolidColorBrush)d;
brush.Color = GetNegativeColor((Color)e.NewValue);
}
private static Color GetNegativeColor(Color color)
{
return Color.FromRgb((byte)(255 - color.R), (byte)(255 - color.G), (byte)(255 - color.B));
}
} <SolidColorBrush x:Key="NegativeAccentColorBrush" local:SolidColorBrushHelper.NegativeColor="{DynamicResource SystemAccentColor}" /> |
Beta Was this translation helpful? Give feedback.
-
Thanks, I did a variation on that with another dep prop to set the shading amount and it works. I notice that some colours don't appear at all in the designer if the keys were overridden as <SolidColorBrush x:Key="ButtonBackground"
Color="{DynamicResource SystemBaseLowColor}"
Opacity="0.5" /> Also when creating an xaml with |
Beta Was this translation helpful? Give feedback.
-
Using I've committed a fix for the |
Beta Was this translation helpful? Give feedback.
-
Hello, Is it still possible to override the default resources by taking into account the theme on v0.9.2? In advance, thanks for your help and for this great library! EDIT: It's okay, I just found <ui:ThemeResources>
<ui:ThemeResources.ThemeDictionaries>
<ResourceDictionary x:Key="Light" ui:ThemeDictionary.Key="Light">
<StaticResource x:Key="TextControlBorderBrush" ResourceKey="SystemControlForegroundBaseMediumBrush" />
<StaticResource x:Key="TextControlBorderBrushPointerOver" ResourceKey="SystemControlHighlightBaseMediumHighBrush" />
</ResourceDictionary>
<ResourceDictionary x:Key="Dark" ui:ThemeDictionary.Key="Dark">
<StaticResource x:Key="TextControlBorderBrush" ResourceKey="SystemControlForegroundBaseMediumBrush" />
<StaticResource x:Key="TextControlBorderBrushPointerOver" ResourceKey="SystemControlHighlightBaseMediumHighBrush" />
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast" ui:ThemeDictionary.Key="HighContrast">
<StaticResource x:Key="TextControlBorderBrush" ResourceKey="SystemControlForegroundBaseMediumBrush" />
<StaticResource x:Key="TextControlBorderBrushPointerOver" ResourceKey="SystemControlHighlightBaseMediumHighBrush" />
</ResourceDictionary>
</ui:ThemeResources.ThemeDictionaries>
</ui:ThemeResources> |
Beta Was this translation helpful? Give feedback.
-
I want to give the buttons a border (in another project that uses the nuget package). How should I override the color key in my own resource dictionary?
For example, in Dark.xaml there is
<m:StaticResource x:Key="ButtonBorderBrush" ResourceKey="SystemControlForegroundTransparentBrush" />
If I want to set this to
SystemControlBackgroundBaseMediumHighBrush
what is the best way that will still respect the theme settings?Beta Was this translation helpful? Give feedback.
All reactions