2012-03-27 42 views
5

假設我有一個DrawingBrush,它有三種硬編碼顏色,即邊框,前景和背景。如何在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}" /> 

問題
什麼是最好的辦法,以便能夠從父Rectangle更改這些顏色,但仍然有一個默認的備用?

在我寫這個問題,我認爲是兩個可能的解決方案......

可能的解決方案#1
使用RelativeSource綁定到每個連接到他們的等價的屬性,例如然而{Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:type Rectangle}}

  1. Rectangle是一個Shape沒有BorderBrush性能;
  2. 我無法提供默認值。在綁定中指定FallbackValue將不起作用,因爲綁定會解析並將其設置爲默認值。 (編輯:當我寫這個,我想我可以使用NullValue財產)。

可能的解決方案#2
收件附加屬性,可以取顏色/刷子的陣列,然後有一個轉換器,以將其映射到GeometryDrawing.Brush。使用Binding.IsNull屬性提供默認值,因爲我可以保證如果附加屬性爲空或未重新映射該顏色時無法映射,則返回空值。

回答

3

我會去dynamic resource reference,在應用程序級別(Application.Resources)定義默認值,並通過在某些控件的資源中添加具有相同鍵的畫筆在本地進行更改。

+0

這可以工作;通常由於其性能影響而避免使用「DynamicResource」。 ...我更喜歡一個更加本地化的解決方案,其中默認顏色被宣佈關閉它們的使用。圖標是在Expression Design中創建的,儘管我嘗試從通用調色板中選取顏色以保持始終不變的一致設計。 – Dennis 2012-03-27 10:50:22

+2

@ DennisRoche:一個側面提示:你可能想要將['x:Shared'](http://msdn.microsoft.com/en-us/library/aa970778.aspx)設置爲'false'否則刷相同的實例無處不在。 – 2012-03-27 13:07:04

+0

謝謝@ H.B。我將繼續調查可用的選項。仍然沒有100%使用'DynamicResource'出售。 – Dennis 2012-03-27 13:36:17

2

您可以爲三種顏色中的每種顏色創建附加屬性,然後創建默認樣式以賦予其默認值。

如果您想使用常規附加屬性語法,則可以在Rectangle聲明中覆蓋這些值。

我能想到的唯一方法是將顏色作爲靜態資源,如果您想覆蓋,您可以在Rectangle的資源字典中重新創建顏色。

+0

使用附加屬性是一種好方法。 – Dennis 2012-03-27 10:54:25