Вопрос
Ну, у меня есть черно-белое приложение, и мне нужна функция для уменьшения яркости, как я могу это сделать? все белое исходит из SolidColorBrush, который сохраняется в ResourceDictionary (Application.xaml), мое текущее решение состоит в том, чтобы поместить пустое окно с непрозрачностью 80% поверх него, но это не позволяет мне использовать основное окно .. р>
Решение
Если все ваши элементы пользовательского интерфейса используют один и тот же Brush
, почему бы просто не изменить Brushes
, чтобы уменьшить яркость? Например:
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;
}
Измените после того, как ваш комментарий о заморозке Application
Если вы используете одну из встроенных кистей (через класс Window
), она будет заморожена. Вместо того, чтобы использовать один из них, объявите свой собственный Resources
, не замораживая его:
<SolidColorBrush x:Key="Brush">White</SolidColorBrush>
Изменить после комментария Роберта о ресурсах уровня приложения:
Роберт прав. Ресурсы, добавленные на уровне <=>, автоматически замораживаются, если они замораживаются. Даже если вы явно просите их не замораживать:
<SolidColorBrush x:Key="ForegroundBrush" PresentationOptions:Freeze="False" Color="#000000"/>
Есть два пути решения этой проблемы:
<Ол>В качестве примера № 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;
}
}
Это не так красиво, но это лучшее, что я могу придумать прямо сейчас.
Другие советы
Решил это, изменив непрозрачность моего корневого элемента, вместо того, чтобы пытаться изменить кисть, но было бы неплохо, если бы некоторые сказали мне, могу ли я это сделать, каким-то образом или это невозможно.
Решение Кента будет работать, если SolidColorBrush
добавить к ресурсам более низкого уровня. Freezables автоматически замораживаются при добавлении в Application.Resources
.