假設我有一個DrawingBrush
,它有三種硬編碼顏色,即邊框,前景和背景。如何在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}" />
問題
什麼是最好的辦法,以便能夠從父Rectangle
更改這些顏色,但仍然有一個默認的備用?
在我寫這個問題,我認爲是兩個可能的解決方案......
可能的解決方案#1
使用RelativeSource
綁定到每個連接到他們的等價的屬性,例如然而{Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:type Rectangle}}
:
Rectangle
是一個Shape
沒有BorderBrush
性能;- 我無法提供默認值。在綁定中指定
FallbackValue
將不起作用,因爲綁定會解析並將其設置爲默認值。 (編輯:當我寫這個,我想我可以使用NullValue
財產)。
可能的解決方案#2
收件附加屬性,可以取顏色/刷子的陣列,然後有一個轉換器,以將其映射到GeometryDrawing.Brush
。使用Binding.IsNull
屬性提供默認值,因爲我可以保證如果附加屬性爲空或未重新映射該顏色時無法映射,則返回空值。
這可以工作;通常由於其性能影響而避免使用「DynamicResource」。 ...我更喜歡一個更加本地化的解決方案,其中默認顏色被宣佈關閉它們的使用。圖標是在Expression Design中創建的,儘管我嘗試從通用調色板中選取顏色以保持始終不變的一致設計。 – Dennis 2012-03-27 10:50:22
@ DennisRoche:一個側面提示:你可能想要將['x:Shared'](http://msdn.microsoft.com/en-us/library/aa970778.aspx)設置爲'false'否則刷相同的實例無處不在。 – 2012-03-27 13:07:04
謝謝@ H.B。我將繼續調查可用的選項。仍然沒有100%使用'DynamicResource'出售。 – Dennis 2012-03-27 13:36:17