Pregunta

Bueno, tengo una aplicación que es en blanco y negro y necesito una función para reducir el brillo, ¿cómo puedo hacer esto? todo el blanco proviene de un SolidColorBrush que se guarda en un ResourceDictionary (Application.xaml), mi solución actual es colocar una ventana vacía que tenga una opacidad del 80%, pero esto no me permite usar la ventana subyacente.

¿Fue útil?

Solución

Si todos sus elementos de la IU están usando el mismo Brush , ¿por qué no simplemente modificar el Brush para reducir el brillo? Por ejemplo:

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

Edite después de su comentario sobre el Pincel que se está congelando:

Si está utilizando uno de los pinceles integrados (a través de la clase Brushes ), se congelará. En lugar de usar uno de ellos, declara tu propio Brush sin congelarlo:

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

Editar después del comentario de Robert sobre recursos de nivel de aplicación:

Robert tiene razón. Los recursos agregados en el nivel Application se congelan automáticamente si se pueden congelar. Incluso si solicita explícitamente que no se congelen:

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

Hay dos formas de evitar esto:

  1. Como sugirió Robert, coloque el recurso en un nivel inferior en el árbol de recursos. Por ejemplo, en una colección de Window Resources . Sin embargo, esto hace que sea más difícil compartir.
  2. Coloque el recurso en un contenedor que no sea congelable.

Como ejemplo de # 2 considere lo siguiente.

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

No es tan bonito, pero es lo mejor que se me ocurre en este momento.

Otros consejos

Solucioné esto cambiando la opacidad de mi elemento raíz en lugar de tratar de modificar un pincel, pero aún así sería bueno si alguien me dijera si puedo hacerlo de alguna manera o no es posible.

La solución de

Kent funcionará si se agrega SolidColorBrush a los recursos en un nivel inferior. Las congelaciones se congelan automáticamente cuando se agregan a Application.Resources .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top