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.
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:
- Come suggerì Robert, metti la risorsa a un livello inferiore nella struttura delle risorse. Ad esempio, nella raccolta
Risorse
diWindow
. Ciò rende più difficile la condivisione. - 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
.