2012-03-27 5 views
5

私はDrawingBrushという3つの色、つまり境界、前景、背景がハードコードされているとします。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からこれらの色を変更することができ、依然としてデフォルトのフォールバックを持っている最良の方法だろうどのような質問

私はこの質問を書くように、私は、例えば、それらと同等のプロパティに、それぞれを接続するための結合RelativeSourceを使用した2つの解決策...

可能な溶液#1
に考えています{Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:type Rectangle}}しかし:

  1. RectangleShapeBorderBrush性質を持っていないという。
  2. デフォルト値を指定できませんでした。バインディングが解決してデフォルト値になるので、バインディングにFallbackValueを指定すると機能しません。 (編集:私はこれを書いているので、おそらくNullValueのプロパティを使うことができると思っています)。

可能な解決策#2
は色/ブラシの配列を受け取り、次いでGeometryDrawing.Brushにマッピングする変換器を有する添付プロパティを書きます。添付されたプロパティがnullまたは色が再マッピングされていない場合にマップできない場合は、null値が返されることを保証できるので、Binding.IsNullプロパティを使用して既定値を指定します。

答えて

3

私はdynamic resource referenceとし、アプリケーションレベル(Application.Resources)でデフォルトを定義し、コントロールのリソースに同じキーのブラシを追加してローカルに変更します。

+0

それはうまくいくかもしれません。パフォーマンスの意味合いから、通常は 'DynamicResource'を使わないでください。 ...私はより多くのローカライズされたソリューションを好むでしょう。アイコンは式のデザインで作成されますが、共通のパレットから色を選択して、常に可能ではない一貫したデザインを維持しようとします。 – Dennis

+2

@DennisRoche:サイドノート:おそらく、['x:Shared'](http://msdn.microsoft.com/en-us/library/aa970778.aspx)を' false'に設定してそれ以外の場合は同じインスタンスがすべての場所で使用されます。 –

+0

ありがとう@HB。利用可能なオプションについては引き続き調査します。まだ 'DynamicResource'を使って100%売れていません。 – Dennis

2

3色のそれぞれに添付プロパティを作成し、デフォルトのスタイルを作成してデフォルト値を与えることができます。

通常の添付プロパティ構文を使用する場合は、Rectangle宣言でこれらの値をオーバーライドできます。

私が考えることができる唯一の方法は、静的リソースとしての色を持つことです。オーバーライドしたい場合はRectangleのリソース辞書に再作成できます。

+0

添付されたプロパティを使用するのは良い方法です。 – Dennis

関連する問題