Pergunta
Bem, eu tenho um aplicativo que é preto e branco e eu preciso de uma função para reduzir o brilho como posso fazer isso? todos os brancos vem de um SolidColorBrush que é guardado em um ResourceDictionary (Application.xaml), a minha solução atual é a de colocar uma janela vazia que está de volta com 80% de opacidade sobre ele, mas isso não permite que eu use a janela subjacente ..
Solução
Se todos os seus elementos de interface do usuário estão usando a mesma Brush
, porque não basta modificar o Brush
para reduzir o brilho? Por exemplo:
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;
}
Editar após o seu comentário sobre o Brush
ser congelados:
Se você estiver usando uma das escovas built-in (via a classe Brushes
) então será congelado. Em vez de usar um deles, declarar a sua própria Brush
sem congelá-lo:
<SolidColorBrush x:Key="Brush">White</SolidColorBrush>
Editar depois do comentário de Robert sobre os recursos de nível de aplicação:
Robert está certo. Recursos adicionados ao nível da Application
são automaticamente congelados se estiverem freezable. Mesmo se você explicitamente pedir-lhes para não ser congelado:
<SolidColorBrush x:Key="ForegroundBrush" PresentationOptions:Freeze="False" Color="#000000"/>
Há duas maneiras de contornar isso que eu posso ver:
- Como Robert sugeriu, coloque o recurso a um nível inferior na árvore de recursos. Por exemplo, na coleção
Window
umResources
. Isso torna mais difícil para compartilhar embora. - Coloque o recurso em um invólucro que não é freezable.
Como exemplo de # 2 considere o seguinte.
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;
}
}
Não é tão bonito, mas é o melhor que pode vir acima com agora.
Outras dicas
Resolvido isso alterando a opacidade do meu elemento raiz em vez de tentar modificar um pincel, mas ainda seria bom se alguns me disseram que se eu posso fazer isso de alguma forma ou que não é possível.
A solução de Kent vai funcionar se o SolidColorBrush
é adicionado aos recursos em um nível inferior. Freezables são automaticamente congelado quando eles são adicionados a Application.Resources
.