Question

Eh bien, j’ai une application en noir et blanc et j’ai besoin d’une fonction permettant de réduire la luminosité. Comment puis-je le faire? tout le blanc provient d'un SolidColorBrush enregistré dans un ResourceDictionary (Application.xaml). Ma solution actuelle consiste à placer une fenêtre vide contenant 80% d'opacité par dessus, mais cela ne me permet pas d'utiliser la fenêtre sous-jacente.

Était-ce utile?

La solution

Si tous vos éléments d'interface utilisateur utilisent le même pinceau , pourquoi ne pas simplement modifier le pinceau pour réduire la luminosité? Par exemple:

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;
}

Modifier après votre commentaire sur le pinceau gelé:

Si vous utilisez l'un des pinceaux intégrés (via la classe Pinceaux ), il sera alors gelé. Au lieu d'utiliser l'un d'entre eux, déclarez votre propre pinceau sans le figer:

<SolidColorBrush x:Key="Brush">White</SolidColorBrush>

Modifier après le commentaire de Robert sur les ressources au niveau de l'application:

Robert a raison. Les ressources ajoutées au niveau Application sont automatiquement gelées si elles sont gelables. Même si vous leur demandez explicitement de ne pas être gelés:

<SolidColorBrush x:Key="ForegroundBrush" PresentationOptions:Freeze="False" Color="#000000"/>

Il y a deux manières de contourner ce problème:

  1. Comme l'a suggéré Robert, placez la ressource à un niveau inférieur dans son arborescence. Par exemple, dans la collection Resources de Window . Cela rend cependant plus difficile le partage.
  2. Placez la ressource dans un wrapper non gelable.

Comme exemple de # 2, considérons ce qui suit.

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;
    }
}

Ce n’est pas aussi beau, mais c’est le meilleur que je puisse trouver pour le moment.

Autres conseils

J'ai résolu ce problème en modifiant l'opacité de mon élément racine au lieu d'essayer de modifier un pinceau, mais ce serait toujours bien si certains me le disaient si je pouvais le faire. Comment ou ce n'est pas possible.

La solution de Kent fonctionnera si le SolidColorBrush est ajouté aux ressources à un niveau inférieur. Les fichiers gelés sont automatiquement gelés lorsqu'ils sont ajoutés à Application.Resources .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top