Skinning: Uso de un Color como Fuente estática para otro Color


Implementé skinning en mi aplicación. La aplicación carga sus Pinceles.diccionario de recursos xaml que utiliza colores que residen en un diccionario de recursos específico de la piel. Así que solo un color.xaml se carga dependiendo de la piel elegida.

Color Específico de la Piel.xaml

    <Color x:Key="TextBoxBackgroundColor">#C4AF8D</Color>
    <Color x:Key="TextBoxForegroundColor">#6B4E2C</Color>
    <Color x:Key="ToolBarButtonForegroundColor">#6B4E2C</Color>

Pinceles.xaml:

    <SolidColorBrush 
        x:Key="TextBoxBackground" 
        Color="{DynamicResource TextBoxBackgroundColor}" />
    <SolidColorBrush 
        x:Key="TextBoxForeground" 
        Color="{DynamicResource TextBoxForegroundColor}" />

Como puede ver, varios colores (TextBoxForegroundColor y ToolBarButtonForegroundColor) son los mismos. Me gustaría evitar eso, ya que se está volviendo más y más confuso especialmente porque los colores utilizados no son reconocibles por su valor hexadecimal. Usted podría aconsejar ahora para combinar ambos colores en uno, pero tengo pieles donde el TextBoxForegroundColor es diferente de la ToolBarButtonForegroundColor.

Lo que me gustaría hacer es algo como esto:

<Color x:Key="DarkBrown">#C4AF8D</Color>

<Color x:Key="TextBoxBackgroundColor" Color={StaticResource DarkBrown} />
<Color x:Key="ToolBarButtonForegroundColor" Color={StaticResource DarkBrown} />

Es esto posible en Xaml? No encontré la manera.

Author: rae1, 2011-01-26

4 answers

Esto?

<Color x:Key="DarkBrown">#C4AF8D</Color>

<DynamicResource x:Key="TextBoxBackgroundColor" ResourceKey="DarkBrown"/>
<DynamicResource x:Key="ToolBarButtonForegroundColor" ResourceKey="DarkBrown"/>

Para casos de uso más avanzados y múltiples niveles de alias consulte esta respuesta.

 39
Author: H.B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-23 11:38:52

¿Por qué no haces pinceles?xaml específico para la piel? Entonces tendrás esto:

<Color x:Key="DarkBrown">#C4AF8D</Color>

<SolidColorBrush x:Key="TextBoxBackgroundBrush" Color={StaticResource DarkBrown} />
<SolidColorBrush x:Key="ToolBarButtonForegroundBrush" Color={StaticResource DarkBrown} />

Otro punto a favor de hacer que los cepillos sean específicos de la piel es que hay situaciones en las que querría hacer que el ToolBarButtonForegroundBrush sea un pincel de color sólido en una piel y un pincel degradado en otra.

 9
Author: Pavlo Glazkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-26 09:04:33

La respuesta de H. B. es muy interesante y he jugado un poco con ella ya que quiero hacer exactamente lo que esta pregunta está pidiendo hacer.

Lo que he notado es que usar un DynamicResource no funciona para WPF 3.5. Es decir, lanza una excepción en tiempo de ejecución (de la que habla Amenti). Sin embargo, si crea colores que hacen referencia al color que desea compartir ... un recurso estático, funciona tanto en WPF 3.5 como en WPF 4.0.

Es decir, este xaml funciona para tanto WPF 3.5 como WPF 4.0:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="ColorsReferencingColors.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640"
    Height="480"
>
    <Window.Resources>
        <Color x:Key="DarkBlue">DarkBlue</Color>
        <StaticResource x:Key="EllipseBackgroundColor" ResourceKey="DarkBlue"/>
        <SolidColorBrush
            x:Key="ellipseFillBrush"
            Color="{DynamicResource EllipseBackgroundColor}"
        />
    </Window.Resources>
    <Grid>
        <StackPanel Margin="25">
            <Ellipse
                Width="200"
                Height="200"
                Fill="{DynamicResource ellipseFillBrush}"
            />
        </StackPanel>
    </Grid>
</Window>

Otra cosa que vale la pena mencionar (de nuevo) es que este enfoque causa estragos entre los diseñadores (es decir, los diseñadores de Visual Studio 2008 y 2010, los diseñadores de Blend 3 y 4). Especulo que esta es la misma razón por la que a Kaxaml 1.7 no le gustaba el xaml de H. B. (si estás siguiendo el flujo de comentarios en la respuesta de H. B.).

Pero mientras rompe a los diseñadores para un caso de prueba simple, no parece romper la superficie de diseño para los grandes aplicación de escala en la que trabajo en mi trabajo diario. ¡Muy raro! En otras palabras, si te preocupan las cosas que aún funcionan en el diseñador, prueba este método de todos modos ... su diseñador todavía puede trabajar!

 6
Author: cplotts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-10 23:07:59

Esa última parte no es posible ya que un color no tiene propiedad Color.

Un color tiene una propiedad R, G, B y A. Así que puedes crear cuatro bytes como recursos:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <sys:Byte x:Key="r">#23</sys:Byte>
    <sys:Byte x:Key="g">#45</sys:Byte>
    <sys:Byte x:Key="b">#67</sys:Byte>
    <sys:Byte x:Key="a">#FF</sys:Byte>

    <Color x:Key="c1" R="{StaticResource r}"
       G="{StaticResource g}"
       B="{StaticResource b}"
       A="{StaticResource a}"/>

    <Color x:Key="c2" R="{StaticResource r}"
       G="{StaticResource g}"
       B="{StaticResource b}"
       A="{StaticResource a}"/>

</ResourceDictionary>

Todavía no es lo que podría preferir, pero debería funcionar.

 3
Author: Erno de Weerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-26 08:25:22