Вопрос

Ну, у меня есть черно-белое приложение, и мне нужна функция для уменьшения яркости, как я могу это сделать? все белое исходит из 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.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top