2010-01-05 21 views
9

Tôi đã tạo ra ControlTemplate của riêng mình cho Button, như thế này:WPF: Tại sao tôi không nên sử dụng {TemplateBinding Margin} trong ControlTemplate - là Margin chỉ dành cho các container của phần tử?

<Style x:Key="LightButtonStyle" TargetType="{x:Type ButtonBase}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ButtonBase}"> 
       <Border 
        x:Name="WrappingBorder" 
        Margin="{TemplateBinding Margin}" 
        ... 
        > 
        <ContentPresenter 
         Content="{TemplateBinding Content}" 
         ... 
         > 
        </ContentPresenter> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Bây giờ, tôi đã nhận thấy rằng khi tôi đặt lề để nút của tôi, như:

<Button 
    Style="{StaticResource LightButtonStyle}" 
    Margin="20" 
    > 
    Hello world! 
</Button> 

nút có Margin thực sự tăng gấp đôi - 40. Tôi cho rằng kiểm soát nên, trên thực tế, không bao giờ sử dụng Margin, và tài sản Margin chỉ được đọc bởi tổ tiên của nút trong giai đoạn sắp xếp. Tôi đã xem xét sau đó vào phong cách mặc định của WPF, và phát hiện ra rằng không ai trong số những người sử dụng Margin.

Đây có phải là kết luận đúng hay không (rằng Margin chỉ được kiểm soát để được sắp xếp chính xác bởi các vùng chứa)? Nói cách khác, mỗi khi tôi sử dụng {TemplateBinding Margin} theo phong cách của tôi, tôi sẽ nhận được lợi nhuận gấp đôi? Và có một số danh sách các thuộc tính tương tự mà kiểm soát của tôi không nên sử dụng (vì chúng chỉ dành cho 'thế giới xung quanh')?

Bạn có chỉ cho tôi trang MSDN giải thích điều này không? Cảm ơn bạn!

EDIT:

Tôi đoán tôi nên tìm câu trả lời trong http://msdn.microsoft.com/en-us/library/ms745058.aspxhttp://msdn.microsoft.com/en-us/library/ms751709.aspx, nhưng tôi không nghĩ rằng họ đề cập một cách rõ ràng rằng nó bao giờ sự kiểm soát người sử dụng thuộc tính Margin, rằng nó là luôn hệ thống tổ tiên hoặc hệ thống wpf đánh giá và sử dụng nó để ảnh hưởng đến bố cục ...

Trả lời

5

Kết luận của bạn là đúng, nếu bạn nhìn vào khung cung cấp mẫu mặc định bạn sẽ thấy rằng Margin bên trong mẫu các Padding thuộc tính của điều khiển.

+0

Cảm ơn, tôi nhận thấy điều này ... Bạn có biết về một số trang hoặc blog blog msdn có thể giải thích vai trò của Margin (và có thể thuộc tính bố cục cụ thể khác) trong bố cục không? Tôi đã cố gắng để google nó, nhưng đã đưa ra không có câu trả lời thực sự. –

+1

Tôi chắc chắn rằng google có thể giúp bạn, nhưng tôi sẽ nói (hay đúng hơn là viết) một điều. Ký quỹ được container sử dụng trong quá trình sắp xếp của quá trình bố trí, vùng chứa sẽ đặt phần tử con ở vị trí bắt nguồn từ các sắp xếp ngang và dọc của nó và lề của nó. –

+0

Cảm ơn bạn, đó là chính xác những gì tôi muốn - rằng tôi ngoại trừ Margin, tôi cũng không bao giờ nên sử dụng s HorizontalAlignment và VerticalAlignment bên trong mẫu. –

5

Mật khẩu được áp dụng tự động bởi hệ thống bố cục, bên trong mẫu điều khiển bạn nên sử dụng Padding để thay thế.

<Border x:Name="WrappingBorder" Margin="{TemplateBinding Padding}" ... /> 
+0

Aviad trả lời đầu tiên (và ám chỉ giai đoạn khi lề được áp dụng trong một bình luận sau), vì vậy tôi chấp nhận câu trả lời của mình - nhưng cảm ơn bạn rất nhiều là tốt! –

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