2011-01-26 24 views
34

Implementé desollar en mi aplicación. La aplicación carga su diccionario de recursos Brushes.xaml que utiliza colores que residen en un diccionario de recursos específico de la máscara. Por lo tanto, solo se carga un Color.xaml según la máscara elegida.Desollado: Uso de un color como StaticResource para otro color

Piel-específico Color.xaml

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

Brushes.xaml:

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

Como se puede ver, varios colores (TextBoxForegroundColor y ToolBarButtonForegroundColor) son los mismos. Me gustaría evitar eso, ya que cada vez es más confuso, sobre todo porque los colores utilizados no son reconocibles por su valor hexadecimal. Puede aconsejar ahora fusionar ambos colores en uno pero tengo máscaras donde el TextBoxForegroundColor es diferente del 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 en absoluto posible en Xaml? No encontré la manera.

Respuesta

34

Esto?

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

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

(Obras por cierto)

+3

Eso se ve muy interesante pero no consigo que funcione. Intenté establecer , pero esto desencadena el mensaje de error "Un objeto del tipo" System.Windows.DynamicResourceExtension "no se puede aplicar a una propiedad que espera el tipo "System.Windows.Media.Color". ¿Estoy haciendo algo mal? – Amenti

+0

Necesita referenciarlo como un StaticResource ('Color =" {StaticResource TextBoxBackgroundColor} "' porque es, de hecho, un recurso estático aunque el la referencia interna es dinámica. –

+1

Lo intenté y ahora compila y funciona. Pero sigo recibiendo el error en el IDE (Visual Studio 2010 Express) pero ahora en relación con el System.Windows.StaticResourceExtension. Esto es problemático ya que efectivamente paraliza el diseño. -Tiempo de uso del Gui-Editor en el IDE. Pero aún así es genial que pueda funcionar de esa manera. ¿Tienes alguna idea de por qué sucede esto? ¿Este error está en VS o estoy haciendo algo mal? – Amenti

2

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

A El color tiene una propiedad R, G, B y A. Por lo tanto, podría 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> 

Aún no es lo que podría preferir, pero debería funcionar.

+0

Gracias. Bueno, esto funcionaría, pero creo que cambiar el color se vuelve tedioso de esta manera, si tienes que copiar y pegar 4 cadenas en lugar de 1 desde el programa de gráficos. – Amenti

+0

Sí, estoy totalmente de acuerdo. –

+0

+1 para la respuesta correcta :-) – kux

7

¿Por qué no solo hace que Brushes.xaml sea específico de la piel? A continuación, tendrá la siguiente:

<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 cepillos de piel específico es que hay situaciones en las que se quieren hacer el ToolBarButtonForegroundBrush un cepillo de color sólido en una piel y un pincel de degradado en otro.

+0

Gracias. Mis máscaras a menudo pero no siempre usan los mismos colores para los mismos pinceles. Así que tendría que copiar mi Brushes.xaml para cada máscara y luego ajustar los recursos de color que contiene. No estoy seguro si esto no es más trabajo. – Amenti

+0

Sí, pero este método le dará la mayor flexibilidad y podría ser más beneficioso a largo plazo. –

6

respuesta de H. B. Es muy interesante y he jugado un rato con él un poco ya que quiero hacer exactamente lo que esta pregunta está pidiendo que hagamos.

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

Es decir, este xaml funciona tanto para WPF 3.5 y 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 merece ser mencionado (de nuevo) es que este enfoque hace estragos con los diseñadores por ahí (es decir, el Visual Studio Diseñadores de 2008 y 2010, los diseñadores de Blend 3 y 4). Yo especulo que esta es la misma razón por la cual a Kaxaml 1.7 no le gustaba la xaml de H.B. (si estás siguiendo el flujo de comentarios en la respuesta de H.B.)

Pero si bien rompe a los diseñadores por una simple prueba, no parece romper la superficie de diseño para la aplicación a gran escala en la que trabajo en mi trabajo diario. Llano raro! En otras palabras, si le importan las cosas que todavía funcionan en el diseñador, intente de todos modos con este método ... ¡su diseñador aún puede funcionar!

+0

Gracias por su descripción detallada (+1). Desafortunadamente en mi caso rompe al diseñador. Todavía estoy usando VS Express, quizás sea un problema en sí mismo (aunque no lo creo). – Amenti

+0

Una actualización. Estoy tan triste, pero este truco ... aunque funciona para nuestra aplicación principal, no funciona para un par de aplicaciones de utilidad que comparten nuestros archivos de máscara (que incluyen el xaml anterior). Entonces, desafortunadamente, voy a tener que retroceder. – cplotts

Cuestiones relacionadas