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 ..

Foi útil?

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:

  1. Como Robert sugeriu, coloque o recurso a um nível inferior na árvore de recursos. Por exemplo, na coleção Window um Resources. Isso torna mais difícil para compartilhar embora.
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top