WPF изменить яркость - PullRequest
       9

WPF изменить яркость

4 голосов
/ 17 марта 2009

Ну, у меня есть приложение, которое черно-белое, и мне нужна функция для снижения яркости, как я могу это сделать? все белое исходит из SolidColorBrush, который сохраняется в ResourceDictionary (Application.xaml), мое текущее решение состоит в том, чтобы поместить пустое окно с непрозрачностью 80% поверх него, но это не позволяет мне использовать основное окно

Ответы [ 3 ]

5 голосов
/ 17 марта 2009

Если все ваши элементы пользовательского интерфейса используют один и тот же 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"/>

Есть два пути решения этой проблемы:

  1. Как предложил Роберт, поместите ресурс на более низкий уровень в дереве ресурсов. Например, в коллекции Window Resources. Это затрудняет совместное использование.
  2. Поместите ресурс в оболочку, которая не замораживается.

В качестве примера # 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;
    }
}

Это не так красиво, но это лучшее, что я могу придумать прямо сейчас.

0 голосов
/ 17 марта 2009

Решение Кента будет работать, если SolidColorBrush будет добавлено к ресурсам более низкого уровня. Freezables автоматически замораживаются, когда они добавляются в Application.Resources.

0 голосов
/ 17 марта 2009

Решил это, изменив Непрозрачность моего корневого элемента вместо того, чтобы пытаться изменить кисть, но было бы неплохо, если бы кто-то сказал мне, могу ли я это сделать, каким-то образом, или это невозможно.

...