Frage

Nun, ich habe eine Anwendung, die schwarz und weiß, und ich brauche eine Funktion, um die Helligkeit zu senken, wie kann ich dies tun? alle wissen von einem SolidColorBrush kommt, die in einem Resource (Application.xaml), meine aktuelle Lösung gespeichert wird, ist ein leeres Fenster zu setzen, die wieder mit 80% Opazität über es ist aber das mir die darunter liegenden Fenster zu verwenden, ist es nicht möglich ..

War es hilfreich?

Lösung

Wenn alle UI-Elemente die gleiche Brush verwenden, warum ändern nicht nur die Brush die Helligkeit zu reduzieren? Zum Beispiel:

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

Bearbeiten nach Ihrem Kommentar zu Brush gefroren sein:

Wenn Sie eine der eingebauten Bürsten (über die Brushes Klasse) verwendet, dann wird es eingefroren werden. Statt einen von ihnen zu verwenden, erklären Sie Ihren eigenen Brush ohne es Einfrieren:

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

Bearbeiten nach Robert Kommentar auf Anwendungsebene Ressourcen:

Robert ist richtig. Ressourcen beim Application Ebene hinzugefügt werden automatisch eingefroren, wenn sie freezable sind. Auch wenn Sie ausdrücklich darum bitten nicht eingefroren werden:

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

Es gibt zwei Möglichkeiten, um dieses, das ich sehen kann:

  1. Wie Robert vorgeschlagen, legen Sie die Ressource auf einem niedrigeren Niveau im Ressourcenbaum. Zum Beispiel in einem Window Sammlung Resources. Dies macht es schwieriger, wenn auch zu teilen.
  2. Legen Sie die Ressource in einem Wrapper, der nicht freezable ist.

Als ein Beispiel # 2 Sehen Sie wie folgt vor.

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

Es ist nicht so schön, aber es ist das Beste, was ich mit jetzt kommen kann.

Andere Tipps

Gelöst dies durch die Undurchsichtigkeit meines Wurzelelementes zu ändern, anstatt eine Bürste zu ändern versuchen, aber es wäre noch schön, wenn einige mir gesagt, wenn ich tun kann, dass einige, wie oder es ist nicht möglich.

Kent-Lösung funktioniert, wenn die SolidColorBrush auf die Ressourcen auf einer niedrigeren Ebene hinzugefügt wird. Freezables werden automatisch eingefroren, wenn sie Application.Resources hinzugefügt sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top