如何在DrawingBrush中重新映射颜色?

Den*_*nis 5 wpf

假设我有一个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}" />
Run Code Online (Sandbox Code Playgroud)

问题
能够从父级更改这些颜色Rectangle,但仍有默认回退的最佳方法是什么?

在我写这个问题时,我想到了两个可能的解决方案......

可能的解决方案#1
使用RelativeSource绑定将每个绑定连接到它们的等效属性,例如{Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:type Rectangle}}:

  1. Rectangle是一个Shape没有BorderBrush财产;
  2. 我无法提供默认值.FallbackValue在绑定中指定将不起作用,因为绑定将解析并采用它的默认值.(编辑:当我写这篇文章时,我认为我可以使用该NullValue属性).

可能的解决方案#2
编写一个附加属性,该属性采用一系列颜色/画笔,然后使用转换器将其映射到GeometryDrawing.Brush.使用Binding.IsNull属性提供默认值,因为如果附加属性为null或未重新映射颜色,如果无法映射,则可以保证返回null值.

H.B*_*.B. 3

我将使用动态资源引用,在应用程序级别定义默认值(Application.Resources),并通过在某些控件的资源中添加具有相同键的画笔来在本地更改它们。

  • @DennisRoche:旁注:您可能需要在画笔上将 [`x:Shared`](http://msdn.microsoft.com/en-us/library/aa970778.aspx) 设置为 `false`否则到处都会使用同一个实例。 (2认同)