2012-03-27 31 views
5

Powiedzmy, że mam DrawingBrush który ma trzy kolory ciężko kodowanych, czyli granicy, na pierwszy plan i tło.Jak zmapować kolory w 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}" /> 

Pytanie
Jaki byłby najlepszym rozwiązaniem, aby móc zmienić te kolory z rodzicem Rectangle, ale nadal posiada domyślny krok wstecz?

Kiedy piszę to pytanie, myślałem do dwóch możliwych rozwiązań ...

Możliwe rozwiązanie nr 1
Używanie RelativeSource wiązania się połączyć każdy z ich własności, np równoważnego {Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:type Rectangle}} jednakże:

  1. Rectangle bycia Shape nie posiada BorderBrush właściwości;
  2. Nie mogłem podać wartości domyślnej. Określenie powiązania nie będzie działało, ponieważ powiązanie zostanie rozwiązane i przyjmie wartość domyślną. (Edit: Kiedy piszę te słowa, myślę, że mógłbym użyć właściwości NullValue).

Możliwe rozwiązanie nr 2
Napisz załączony właściwość, która pobiera tablicę kolorów/szczotek i wtedy konwerter mapować go do GeometryDrawing.Brush. Podaj wartość domyślną za pomocą właściwości Binding.IsNull, ponieważ mogę zagwarantować, że zwracana jest wartość pusta, jeśli nie można odwzorować, jeśli załączona właściwość ma wartość null lub że nie ma odwzorowania koloru.

Odpowiedz

3

Wybrałbym numer dynamic resource reference, definiując ustawienia domyślne na poziomie aplikacji (Application.Resources) i zmieniłem je lokalnie, dodając pędzle z tym samym kluczem w niektórych zasobach kontrolek.

+0

To może zadziałać; zwykle unikaj używania 'DynamicResource' z powodu jego wpływu na wydajność. ... Wolałbym bardziej zlokalizowane rozwiązanie, w którym zadeklarowane są domyślne kolory. Ikony są tworzone w projekcie Expression Design i próbuję wybierać kolory ze wspólnej palety, aby zachować spójny projekt, który nie zawsze jest możliwy. – Dennis

+2

@DennisRoche: Uwaga dodatkowa: prawdopodobnie będziesz chciał ustawić ['x: Shared'] (http://msdn.microsoft.com/en-us/library/aa970778.aspx) na" false "na brush inaczej to samo wystąpienie jest używane wszędzie. –

+0

Dzięki @ H.B. Będę nadal badać dostępne opcje. Nadal nie w 100% sprzedawane przy użyciu 'DynamicResource'. – Dennis

2

Można utworzyć dołączonych właściwości dla każdego z trzech kolorów, a następnie utworzyć domyślny styl dać im wartości domyślne.

Następnie można zastąpić te wartości w deklaracji Rectangle jeśli chcesz przy użyciu normalnej składni dołączone nieruchomości.

Jedyny inny sposób, jaki mogę wymyślić, to mieć kolory jako zasoby statyczne, które można odtworzyć w słowniku zasobów Rectangle, jeśli chcesz zastąpić.

+0

Korzystanie z dołączonych właściwości jest dobrym rozwiązaniem. – Dennis