2012-03-27 16 views
5

Supongamos que tengo un DrawingBrush que tiene tres colores codificados, es decir, un borde, un primer plano y un fondo.Cómo reasignar colores en DrawingBrush?

EventIcon

<!-- Resource --> 
<DrawingBrush x:Key="EventIcon" Stretch="Uniform"> 
    <DrawingBrush.Drawing> 
     <DrawingGroup> 
      <DrawingGroup.Children> 
       <GeometryDrawing Brush="#FF9200CE" Geometry="F1 M 51.2119,61.4688L 43.4193,61.4688L 43.4194,29.318L 27.8341,29.318L 27.834,61.4688L 20.0414,61.4688L 35.6267,77.1353L 51.2119,61.4688 Z "/> 
       <GeometryDrawing Brush="#FFB400FF" Geometry="F1 M 44.4789,64.2014L 40.2667,64.2667L 40.13,29.318L 27.8341,29.318L 27.834,61.4688L 20.0414,61.4688L 33.8667,75.1467L 44.4789,64.2014 Z "/> 
       <GeometryDrawing Geometry="F1 M 51.2119,61.4688L 43.4193,61.4688L 43.4194,29.318L 27.8341,29.318L 27.834,61.4688L 20.0414,61.4688L 35.6267,77.1353L 51.2119,61.4688 Z "> 
        <GeometryDrawing.Pen> 
         <Pen Thickness="2" StartLineCap="Round" EndLineCap="Round" LineJoin="Round" Brush="#FF3D0033"/> 
        </GeometryDrawing.Pen> 
       </GeometryDrawing> 
       <GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M 33.7559,53.2538L 32.6202,40.9989L 32.6202,35.3362L 37.3531,35.3362L 37.3531,40.9989L 36.2333,53.2538L 33.7559,53.2538 Z M 32.6202,59.6771L 32.6202,54.9442L 37.3531,54.9442L 37.3531,59.6771L 32.6202,59.6771 Z "/> 
      </DrawingGroup.Children> 
     </DrawingGroup> 
    </DrawingBrush.Drawing> 
</DrawingBrush> 

<!-- Usage --> 
<Rectangle Width="16" Height="16" Fill="{StaticResource EventIcon}" /> 

Pregunta
lo que sería el mejor enfoque para poder cambiar estos colores de los padres Rectangle, y aún así tener una reserva predeterminado?

Al momento de escribir esta pregunta, he pensado a dos posibles soluciones ...

Posible solución # 1
El uso de un RelativeSource unión para conectar cada uno a su propiedad equivalentes, por ejemplo, {Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:type Rectangle}} sin embargo:

  1. Rectangle ser un Shape no tiene BorderBrush propiedades;
  2. No pude proporcionar un valor predeterminado. Especificar FallbackValue en el enlace no funcionará ya que el enlace se resolvería y tomaría su valor predeterminado. (Edit: Mientras escribo esto, creo que podría usar la propiedad NullValue).

Posible solución # 2
Escribir una propiedad adjunta que tiene una gran variedad de colores/cepillos y luego tener un convertidor para asignarlo a la GeometryDrawing.Brush. Proporcione un valor predeterminado utilizando la propiedad Binding.IsNull, ya que puedo garantizar que se devuelve un valor nulo si no se puede asignar si la propiedad adjunta es nula o si ese color no se reasigna.

Respuesta

3

Me gustaría ir con un dynamic resource reference, definir los valores predeterminados en el nivel de aplicación (Application.Resources) y cambiarlos localmente agregando pinceles con la misma clave en algunos recursos de control.

+0

Eso podría funcionar; generalmente evite usar 'DynamicResource' debido a sus implicaciones de rendimiento. ... Preferiría una solución más localizada en la que los colores predeterminados se declaren cercanos a su uso. Los íconos se crean en un Diseño de Expresión y mientras trato de elegir colores de una paleta común para mantener un diseño consistente que no siempre es posible. – Dennis

+2

@DennisRoche: una nota al margen: es probable que desee establecer ['x: Shared'] (http://msdn.microsoft.com/en-us/library/aa970778.aspx) en' false' en el cepillo de lo contrario, la misma instancia se utiliza en todas partes. –

+0

Gracias @ H.B. Continuaré investigando las opciones disponibles. Todavía no se vende al 100% usando 'DynamicResource'. – Dennis

2

Puede crear propiedades adjuntas para cada uno de los tres colores y luego crear un estilo predeterminado para darles los valores predeterminados.

Podría anular estos valores en su declaración Rectangle si desea utilizar la sintaxis normal de la propiedad adjunta.

La única otra forma en que puedo pensar es tener los colores como recursos estáticos, que podría recrear en el diccionario de recursos de Rectangle si desea sobrescribir.

+0

El uso de propiedades adjuntas es un buen enfoque. – Dennis

Cuestiones relacionadas