Domanda

Beh, ho un'applicazione in bianco e nero e ho bisogno di una funzione per abbassare la luminosità, come posso fare? tutto il bianco proviene da un SolidColorBrush che viene salvato in un ResourceDictionary (Application.xaml), la mia soluzione attuale è quella di mettere una finestra vuota con 80% di opacità su di essa, ma questo non mi permette di usare la finestra sottostante.

È stato utile?

Soluzione

Se tutti gli elementi dell'interfaccia utente utilizzano lo stesso pennello , perché non modificare semplicemente il pennello per ridurre la luminosità? Ad esempio:

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

Modifica dopo il tuo commento sul Pennello bloccato:

Se si utilizza uno dei pennelli incorporati (tramite la classe Pennelli ), verrà congelato. Invece di usarne uno, dichiara il tuo Brush senza congelarlo:

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

Modifica dopo il commento di Robert sulle risorse a livello di applicazione:

Robert ha ragione. Le risorse aggiunte al livello Applicazione vengono congelate automaticamente se sono congelabili. Anche se chiedi esplicitamente che non vengano congelati:

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

Ci sono due modi per aggirare ciò che posso vedere:

  1. Come suggerì Robert, metti la risorsa a un livello inferiore nella struttura delle risorse. Ad esempio, nella raccolta Risorse di Window . Ciò rende più difficile la condivisione.
  2. Metti la risorsa in un wrapper che non è congelabile.

Come esempio di # 2 considerare quanto segue.

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

Non è così carino, ma è il migliore che posso inventare adesso.

Altri suggerimenti

Risolto questo cambiando l'opacità del mio elemento radice invece di provare a modificare un pennello, ma sarebbe comunque bello se qualcuno mi dicesse se posso farlo in qualche modo o non è possibile.

La soluzione di Kent funzionerà se SolidColorBrush viene aggiunto alle risorse a un livello inferiore. I freezable vengono congelati automaticamente quando vengono aggiunti a Application.Resources .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top