2009-03-29 19 views
9

Trong <Window.Resources> tôi đã xác định phong cách sau đây:Có thể thiết lập một kiểu trong XAML có ảnh hưởng có chọn lọc đến các điều khiển không?

<Style x:Key="textBlockStyle" TargetType="TextBlock"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 

tôi đã xác định một số lưới nơi tôi có bốn TextBlocks:

<WrapPanel> 
     <TextBlock Style="{StaticResource textBlockStyle}">Server</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">IP</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">Port</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">Status</TextBlock> 
    </WrapPanel> 

Vấn đề: Tôi cần phải tham khảo các textBlockStyle bốn lần.

Câu hỏi: Có thể đặt kiểu đó chỉ một lần tại WrapPanel hoặc ở nơi khác mà không lặp lại tham chiếu đến kiểu không?

Có lẽ cái gì đó như:

<WrapPanel Style="{StaticResource textBlockStyle}"> 
     <TextBlock>Server</TextBlock> 
     <TextBlock>IP</TextBlock> 
     <TextBlock>Port</TextBlock> 
     <TextBlock>Status</TextBlock> 
    </WrapPanel> 

Tôi không tìm kiếm một giải pháp toàn cầu! Tôi có thể xóa thuộc tính x:Key="textBlockStyle", nhưng điều đó sẽ ảnh hưởng đến tất cảTextBlocks trong Cửa sổ. Tôi cần một cơ chế chọn lọc hơn, nhưng không có sự sao chép mã xấu xí đó.

Trả lời

17

Bạn có một số tùy chọn, được trình bày ở đây theo thứ tự độ lớn của chúng.

Lựa chọn 1: Xác định phong cách mà không một chìa khóa ở một mức độ thấp hơn

Bạn có thể dính vào các nguồn tài nguyên ở cấp WrapPanel để nó chỉ ảnh hưởng đến điều khiển bên trong đó WrapPanel: Thông báo

<WrapPanel> 
    <WrapPanel.Resources> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Margin" Value="5,0,5,0"/> 
     </Style> 
    </WrapPanel.Resources> 

    <!-- TextBlocks here --> 
</WrapPanel> 

thiếu chìa khóa. Style này sẽ áp dụng cho tất cả TextBlock s trong số WrapPanel.

Phương án 2: Xác định phong cách với một chìa khóa và một lần nữa mà không ở một mức độ thấp hơn

Nếu bạn xác định Style ở một mức độ cao hơn với một chìa khóa, sau đó bạn có thể định nghĩa Style khác ở một mức độ thấp hơn mà không cần một chìa khóa, và cơ sở mà Style ở tầng cao hơn một:

<Window> 
    <Window.Resources> 
     <Style TargetType="TextBlock" x:Key="textBlockStyle"> 
      <Setter Property="Margin" Value="5,0,5,0"/> 
     </Style> 
    </Window.Resources> 

    <WrapPanel> 
     <WrapPanel.Resources> 
      <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle"/> 
     </WrapPanel.Resources> 

     <!-- TextBlocks here --> 
    </WrapPanel> 
</Window> 

Điều này dẫn đến một Style được tự động áp dụng cho TextBlock s bên trong WrapPanel, nhưng không phải bên ngoài nó. Ngoài ra, bạn không sao chép các chi tiết của Style - chúng được lưu trữ ở mức cao hơn.

Lựa chọn 3: Đặt Styles trong một ResourceDictionary và có chọn lọc kết hợp nó

Cuối cùng, bạn có thể đặt Style của bạn trong một riêng biệt ResourceDictionary và có chọn lọc kết hợp từ điển đó vào một của kiểm soát Resources bộ sưu tập:

<!-- TextBlockStyles.xaml --> 
<ResourceDictionary> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 
</ResourceDictionary> 

<!-- Window.xaml --> 
<Window> 
    <WrapPanel> 
     <WrapPanel.Resources> 
      <ResourceDictionary> 
       <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary Source="TextBlockStyles.xaml"/> 
       </ResourceDictionary.MergedDictionaries> 
      </ResourceDictionary> 
     </WrapPanel.Resources> 
    </WrapPanel> 
</Window> 

<!-- Alternative Window.xaml if you have only one RD to merge in --> 
<Window> 
    <WrapPanel> 
     <WrapPanel.Resources> 
      <ResourceDictionary Source="TextBlockStyles.xaml"/> 
     </WrapPanel.Resources> 
    </WrapPanel> 
</Window> 

Giờ đây, bạn có thể có bao nhiêu bộ kiểu được xác định trong từ điển riêng biệt tùy thích, sau đó áp dụng có chọn lọc chúng vào cây phần tử của bạn.

+0

Tôi thường thích tùy chọn 2 nếu tôi có phong cách đã được xác định và sử dụng nó ở nơi khác, nếu không tùy chọn 1. Đối với những gì nó có giá trị. Câu trả lời tuyệt vời Kent. –

2

yup, bạn có thể làm điều đó.bạn gần như có ý tưởng đúng. bạn làm điều đó như thế này ....

<WrapPanel> 
< WrapPanel. Resources > 
<Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 
</WrapPanel.Resources/> 
     <TextBlock Server</TextBlock> 
     <TextBlock >IP</TextBlock> 
     <TextBlock >Port</TextBlock> 
     <TextBlock >Status</TextBlock> 
    </WrapPanel> 

bằng cách sử dụng cú pháp {x: type} bạn không cần phím x: nó sẽ đặt kiểu cho tất cả các textblocks trong wrappanel. nếu bạn muốn các kiểu khác, bạn vẫn có thể sử dụng phím x: và thiết lập tính năng tạo phong cách trên khối chữ.

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