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?
<!-- 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:
Rectangle
ser unShape
no tieneBorderBrush
propiedades;- 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 propiedadNullValue
).
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.
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
@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. –
Gracias @ H.B. Continuaré investigando las opciones disponibles. Todavía no se vende al 100% usando 'DynamicResource'. – Dennis