Если все ваши элементы пользовательского интерфейса используют один и тот же Brush
, почему бы просто не изменить Brush
, чтобы уменьшить яркость? Например:
public void ReduceBrightness()
{
var brush = Application.Resources("Brush") as SolidColorBrush;
var color = brush.Color;
color.R -= 10;
color.G -= 10;
color.B -= 10;
brush.Color = color;
}
Редактировать после того, как ваш комментарий к Brush
заморожен:
Если вы используете одну из встроенных кистей (через класс Brushes
), она будет заморожена. Вместо того, чтобы использовать один из них, объявите свой Brush
, не замораживая его:
<SolidColorBrush x:Key="Brush">White</SolidColorBrush>
Изменить после комментария Роберта по ресурсам уровня приложения:
Роберт прав. Ресурсы, добавленные на уровне Application
, автоматически замораживаются, если они замораживаются. Даже если вы явно просите их не замораживать:
<SolidColorBrush x:Key="ForegroundBrush" PresentationOptions:Freeze="False" Color="#000000"/>
Есть два пути решения этой проблемы:
- Как предложил Роберт, поместите ресурс на более низкий уровень в дереве ресурсов. Например, в коллекции
Window
Resources
. Это затрудняет совместное использование.
- Поместите ресурс в оболочку, которая не замораживается.
В качестве примера # 2 рассмотрим следующее.
App.xaml
<Application.Resources>
<FrameworkElement x:Key="ForegroundBrushContainer">
<FrameworkElement.Tag>
<SolidColorBrush PresentationOptions:Freeze="False" Color="#000000"/>
</FrameworkElement.Tag>
</FrameworkElement>
</Application.Resources>
Window1.xaml
<StackPanel>
<Label Foreground="{Binding Tag, Source={StaticResource ForegroundBrushContainer}}">Here is some text in the foreground color.</Label>
<Button x:Name="_button">Dim</Button>
</StackPanel>
Window1.xaml.cs
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
_button.Click += _button_Click;
}
private void _button_Click(object sender, RoutedEventArgs e)
{
var brush = (FindResource("ForegroundBrushContainer") as FrameworkElement).Tag as SolidColorBrush;
var color = brush.Color;
color.R -= 10;
color.G -= 10;
color.B -= 10;
brush.Color = color;
}
}
Это не так красиво, но это лучшее, что я могу придумать прямо сейчас.