2010-10-04 11 views
13

Tôi gặp vấn đề về Silverlight Tôi đã sử dụng hai ngày để chiến đấu: mẫu có kiểu điều khiển nút. Trong nút bê tông, tôi có một khung với đường dẫn là nội dung. Vấn đề là tôi muốn các đường dẫn tô màu để liên kết với Foreground từ ContentControl trong khuôn mẫu.Ràng buộc thuộc tính điền vào đường dẫn đến thuộc tính Foreground từ ContentControl theo kiểu

Tuy nhiên, tôi đã không thể tìm ra cách xây dựng ràng buộc để đến Forground. Nếu tôi muốn, ví dụ sử dụng TextBlock, nó sẽ tự động lấy màu Forground từ Style. Như mong đợi khi văn bản có màu Foreground. Lý do cho việc ràng buộc là các hình ảnh động kiểm soát các forground và tôi muốn nó để tuyên truyền để điền vào màu sắc của con đường. Bất kỳ ý tưởng?

Mẫu chứa sau:

<Style x:Key="PathButtonStyle" TargetType="Button"> 

... Animations and state stuff 

    <Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" > 
    <ContentControl x:Name="ContentContainer" 
     ContentTemplate="{TemplateBinding ContentTemplate}" 
     Content="{TemplateBinding Content}" 
     Foreground="{TemplateBinding Foreground}" /> 
    </Border> 
</Style> 

Down trong Layout của tôi, tôi đã điều sau đây:

<Button x:Name="Play" Style="{StaticResource PathButtonStyle}" > 
    <Canvas x:Name="PlayIcon"> 
    <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
      Fill="{PATH TO CONTENTCONTROLS FOREGROUND}" /> 
    </Canvas> 
</Button> 

Tôi đã cleand lên mã và loại bỏ những thứ để làm cho nó dễ đọc hơn, nhưng Tôi hy vọng bạn có được ý tưởng đằng sau nó.

Trả lời

9

Vì bạn đã đưa ra một tên cho nút bấm của bạn, bạn có thể sử dụng Binding ElementName tham số:

<Button x:Name="Play" Style="{StaticResource PathButtonStyle}" > 
    <Canvas x:Name="PlayIcon"> 
     <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
      Fill="{Binding Foreground, ElementName=Play}" /> 
    </Canvas> 
</Button> 
+3

Tôi không hỗ trợ hoạt cảnh tiền cảnh. Tôi ở lại tìm kiếm giải pháp. –

1

Thực ra thay vì đặt Canvas làm Nội dung trong Nút, bạn có thể đặt nó trong Templete.

 <Style x:Key="PathButtonStyle" TargetType="Button"> 

    ... Animations and state stuff 
    <Canvas x:Name="PlayIcon"> 
    <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
      Fill="{TemplateBinding Foreground}" /> 
    </Canvas> 
     <Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" > 
     <ContentControl x:Name="ContentContainer" 
      ContentTemplate="{TemplateBinding ContentTemplate}" 
      Content="{TemplateBinding Content}" 
      Foreground="{TemplateBinding Foreground}" /> 
     </Border> 
    </Style> 

bạn có thể làm bất cứ điều gì bạn muốn nếu bạn sử dụng kịch bản này.

+5

Câu trả lời này làm cho không có ý nghĩa, đường dẫn __is__ nội dung, tại sao lại bận tâm nếu có một mẫu nếu chỉ cần một đường dẫn. Ý tưởng là để có thể đặt một loạt các đường dẫn khác nhau vào nút theo kiểu. – AnthonyWJones

+0

Tôi đã di chuyển Canvas tới Template vì ở đó tôi sẽ có thể liên kết với ContentContainer. Theo như tôi biết không có cách nào khác để làm điều đó. Thực tế bạn có thể có Template ngay cả khi một Path là cần thiết (đơn giản là vì bạn có thể cần một số thay đổi mẫu ...) Mặc dù câu trả lời ở trên là cách để đi cho vấn đề hiện tại. – Sonosar

0

Binding để ContentControl sẽ giúp (Silverlight 5):

<Button x:Name="Play" Style="{StaticResource PathButtonStyle}" > 
    <Canvas x:Name="PlayIcon"> 
     <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
       Fill="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=ContentControl}}" /> 
    </Canvas> 
</Button>