2012-03-27 37 views
5

Giả sử rằng tôi có một số DrawingBrush có ba màu được mã hóa cứng, tức là đường viền, tiền cảnh và nền.Làm thế nào để remap màu sắc trong một 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}" /> 

Câu hỏi
Điều gì sẽ là phương pháp tốt nhất để có thể thay đổi các màu sắc từ cha mẹ Rectangle, nhưng vẫn có một dự phòng mặc định?

Như tôi đã viết câu hỏi này, tôi đã nghĩ đến hai giải pháp khả thi ...

Giải pháp # 1
Sử dụng một RelativeSource ràng buộc để kết nối mỗi tài sản tương đương của họ, ví dụ {Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:type Rectangle}} tuy nhiên:

  1. Rectangle là một Shape không có BorderBrush tài sản;
  2. Tôi không thể cung cấp giá trị mặc định. Chỉ định FallbackValue trong liên kết sẽ không hoạt động vì liên kết sẽ giải quyết và lấy giá trị mặc định của nó. (Chỉnh sửa: Khi tôi viết điều này, tôi nghĩ rằng tôi có thể sử dụng thuộc tính NullValue).

Giải pháp # 2
Viết một tài sản gắn liền mà phải mất một mảng màu sắc/bàn chải và sau đó có một bộ chuyển đổi để ánh xạ nó vào GeometryDrawing.Brush. Cung cấp một giá trị mặc định bằng cách sử dụng thuộc tính Binding.IsNull vì tôi có thể đảm bảo một giá trị null được trả về nếu nó không thể ánh xạ nếu thuộc tính đính kèm là null hoặc màu đó không được ánh xạ lại.

Trả lời

3

Tôi sẽ đi với số dynamic resource reference, xác định giá trị mặc định ở cấp ứng dụng (Application.Resources) và thay đổi cục bộ bằng cách thêm bàn chải có cùng khóa trong tài nguyên của một số kiểm soát.

+0

Điều đó có thể hoạt động; thường tránh sử dụng 'DynamicResource' do tác động của nó. ... Tôi thích một giải pháp được bản địa hóa hơn, nơi các màu mặc định được khai báo gần việc sử dụng chúng. Các biểu tượng được tạo ra trong một thiết kế biểu thức và trong khi tôi cố gắng để chọn màu sắc từ một bảng màu chung để giữ một thiết kế nhất quán mà không phải là luôn luôn có thể. – Dennis

+2

@DennisRoche: Một lưu ý phụ: Có thể bạn sẽ muốn đặt ['x: Shared'] (http://msdn.microsoft.com/en-us/library/aa970778.aspx) thành' false' trên bàn chải nếu không cùng một ví dụ được sử dụng ở khắp mọi nơi. –

+0

Cảm ơn @ H.B. Tôi sẽ tiếp tục điều tra các tùy chọn có sẵn. Vẫn chưa được bán 100% khi sử dụng 'DynamicResource'. – Dennis

2

Bạn có thể tạo thuộc tính đính kèm cho từng màu trong ba màu, sau đó tạo kiểu mặc định để cung cấp cho chúng giá trị mặc định.

Sau đó, bạn có thể ghi đè các giá trị này trong khai báo Rectangle nếu bạn muốn sử dụng cú pháp thuộc tính được đính kèm thông thường.

Cách duy nhất khác tôi có thể nghĩ là có các màu như tài nguyên tĩnh, mà bạn có thể tạo lại trong từ điển tài nguyên của Rectangle nếu bạn muốn ghi đè.

+0

Sử dụng thuộc tính đính kèm là một cách tiếp cận tốt. – Dennis

Các vấn đề liên quan