2009-03-17 5 views
4

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

ответ

5

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

Есть два способа обойти это, что я могу видеть:

  1. Как Роберт предложил, поставить ресурс на более низком уровне в ресурсе дерево. Например, в сборнике WindowResources. Это затрудняет обмен.
  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

щетка замерзла, поэтому я не могу ее изменить :(Есть ли способ обойти это? – Peter

+0

Это работало как шарм, но у меня проблемы при попытке использовать его в стиле -> http://stackoverflow.com/questions/1443564/wpf-style-problem – Peter

0

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

0

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

+0

Что вы подразумеваете под более низким уровнем? – Peter

+0

Кент ответил на это во втором редакции - вы можете добавить его в качестве ресурса своего главного окна. –