2012-03-27 25 views
5

Üç renk kodlu, yani kenarlık, ön plan ve arka plana sahip bir DrawingBrush ürünüm olduğunu varsayalım.Bir DrawingBrush'ta renkleri nasıl değiştirebilirim?

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}" /> 

Soru
Ne iyi yaklaşım ebeveyn Rectangle bu renklerini değiştirmek, henüz hala varsayılan bir yedeği var edebilmek için olurdu? Bir RelativeSource eşdeğer mülkiyet, örneğin her bağlamak için bağlayıcı kullanarak Bu soruyu yazarken, ben iki olası çözümlere düşündüm

...

Olası Çözüm 1.
{Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:type Rectangle}} ancak:

  1. Rectangle bir ShapeBorderBrush özelliklere sahip değildir olmak;
  2. Varsayılan değer sağlayamadım. Ciltlemede FallbackValue belirtilmesi, ciltlemenin çözüleceği ve varsayılan değeri alacağı için çalışmaz. (Düzelt: Bunu yazarken, NullValue özelliğini kullanabileceğimi düşünüyorum).

Olası Çözüm 2.
renkler/fırçaların dizisini alır ve daha sonra GeometryDrawing.Brush eşlemek için bir dönüştürücü iliştirilmiş bir özellik yazın. Eklenen özelliğin boş olup olmadığına veya bu rengin yeniden eşlenmediğine eşleme yapamıyorsa boş değer döndürdüğünden, Binding.IsNull özelliğini kullanarak varsayılan bir değer girin.

cevap

3

dynamic resource reference ile gider, varsayılanları uygulama düzeyinde (Application.Resources) tanımlayabilir ve bazı denetim kaynaklarında aynı tuşa sahip fırçalar ekleyerek bunları yerel olarak değiştirebilirim.

+0

Bu işe yarayabilir; Genellikle performans sonuçları nedeniyle 'DynamicResource' kullanmaktan kaçının. ... Varsayılan renklerin kullanımının yakın olduğu bildirilen daha yerelleştirilmiş bir çözümü tercih ederim. Simgeler bir İfade Tasarımında oluşturulur ve her zaman mümkün olmayan tutarlı bir tasarımı korumak için ortak bir paletten renkleri almaya çalışıyorum. – Dennis

+2

@DennisRoche: Bir yan not: Muhtemelen ['x: Shared'] 'i (http://msdn.microsoft.com/en-us/library/aa970778.aspx)' false' olarak ayarlamak isteyeceksiniz. aksi takdirde aynı örnek her yerde kullanılır. –

+0

Teşekkürler @ H.B. Mevcut seçenekleri araştırmaya devam edeceğim. Hala DynamicResource' kullanılarak satılan% 100 değil. – Dennis

2

Üç rengin her biri için ekli özellikler oluşturmak ve sonra bunları varsayılan değerleri vermek için varsayılan bir stil oluşturmak olabilir. Normal ekli özelliği sözdizimi kullanılarak isterse

Daha sonra Rectangle bildiriminde bu değerleri geçersiz olabilir.

Düşünebildiğim tek yolu, renkleri geçersiz kılmak istiyorsanız, Rectangle 'un kaynak sözlüğünde yeniden oluşturabileceğiniz statik kaynaklar olarak kullanmaktır.

+0

Ekli özellikleri kullanmak iyi bir yaklaşımdır. – Dennis

İlgili konular