假设我有一个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}" />
Run Code Online (Sandbox Code Playgroud)
问题
能够从父级更改这些颜色Rectangle,但仍有默认回退的最佳方法是什么?
在我写这个问题时,我想到了两个可能的解决方案......
可能的解决方案#1
使用RelativeSource绑定将每个绑定连接到它们的等效属性,例如{Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:type Rectangle}}:
Rectangle是一个Shape没有BorderBrush财产;FallbackValue在绑定中指定将不起作用,因为绑定将解析并采用它的默认值.(编辑:当我写这篇文章时,我认为我可以使用该NullValue属性).可能的解决方案#2
编写一个附加属性,该属性采用一系列颜色/画笔,然后使用转换器将其映射到GeometryDrawing.Brush.使用Binding.IsNull属性提供默认值,因为如果附加属性为null或未重新映射颜色,如果无法映射,则可以保证返回null值.