У меня есть приложение, которое является черно-белым, и мне нужна функция для снижения яркости, как я могу это сделать? все белое происходит из SolidColorBrush, который сохраняется в ResourceDictionary (Application.xaml), мое текущее решение - положить пустое окно, которое возвращается с непрозрачностью 80%, но это не позволяет мне использовать базовое окно.Изменение яркости WPF
ответ
Если все ваши элементы пользовательского интерфейса используют одинаковые 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;
}
Edit после комментария на Brush
будучи замороженным:
Если вы используете один из встроенных кистей (через Brushes
класса), то он будет заморожен. Вместо того чтобы использовать один из них, объявить свой собственный Brush
без замораживанием:
<SolidColorBrush x:Key="Brush">White</SolidColorBrush>
Edit после комментария Роберта на ресурсы на уровне приложений:
Роберт прав. Ресурсы, добавленные на уровне 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;
}
}
Это не как красиво, но это лучшее, что я могу придумать прямо сейчас.
Решив это, изменив непрозрачность моего корневого элемента вместо того, чтобы пытаться изменить кисть, но все равно было бы неплохо, если бы кто-то сказал мне, могу ли я сделать это как-то или не возможно.
Решение Kent будет работать, если SolidColorBrush
будет добавлено к ресурсам на более низком уровне. Freezables автоматически замораживаются, когда они добавляются к Application.Resources
.
Что вы подразумеваете под более низким уровнем? – Peter
Кент ответил на это во втором редакции - вы можете добавить его в качестве ресурса своего главного окна. –
щетка замерзла, поэтому я не могу ее изменить :(Есть ли способ обойти это? – Peter
Это работало как шарм, но у меня проблемы при попытке использовать его в стиле -> http://stackoverflow.com/questions/1443564/wpf-style-problem – Peter