2015-03-28 13 views
13

Trong WPF (hoặc thậm chí là ứng dụng Windows 8 hoặc 8.1), bạn có ba cách có thể để thêm văn bản trong một điều khiển.Chạy so với nội dung so với văn bản trong WPF

  1. Run yếu tố bên trong TextBlock yếu tố

    <TextBlock> 
        <Run>My text</Run> 
    </TextBlock> 
    
  2. Text tài sản như thuộc tính của TextBlock yếu tố

    <TextBlock Text="My text" /> 
    
  3. Text tài sản như yếu tố bên trong TextBlock yếu tố

    <TextBlock> 
        <TextBlock.Text>my text</TextBlock.Text> 
    </TextBlock>` 
    

Sự khác nhau giữa ba cách tiếp cận này là gì? Và tại sao bạn phải sử dụng Text cho số TextBlockContent cho số ComboboxItem?

+0

Có tài liệu trực tuyến và cũng có một vài cuốn sách hay về WPF, nơi các điều khiển này và sự khác biệt của chúng được giải thích chi tiết. – Clemens

+0

@Hein cách bạn có thể biên dịch 3. và 4.? Bạn có thể thêm nhiều mã hơn không? Trong ứng dụng ví dụ của tôi, nó không biên dịch – Domysee

Trả lời

24

Điều khiển với thuộc tính Text chỉ có thể chấp nhận một chuỗi và được hiển thị theo cách cụ thể được kiểm soát bởi điều khiển đó. Ví dụ về các điều khiển như vậy là TextBlockTextBox.

Điều khiển với thuộc tính Content có thể có nghĩa là bất kỳ số nào object được đặt thành thuộc tính đó. Các điều khiển này thường chuyển tiếp giá trị đến thuộc tính Content trên ContentPresenter. Các tài liệu ContentPresenter Class có khối có liên quan này:

các ContentPresenter sử dụng logic sau đây để hiển thị các nội dung:

  • Nếu tài sản trên ContentPresenter ContentTemplate được thiết lập, ContentPresenter áp dụng mà DataTemplate để sở hữu nội dung và UIElement kết quả và các phần tử con của nó, nếu có, được hiển thị. Để biết thêm thông tin về các đối tượng DataTemplate, xem Tổng quan về Templating Data.
  • Nếu thuộc tính ContentTemplateSelector trên ContentPresenter được đặt, ContentPresenter áp dụng DataTemplate thích hợp cho thuộc tính Nội dung và kết quả là UIElement và các phần tử con của nó, nếu có, được hiển thị.
  • Nếu có một DataTemplate được liên kết với loại nội dung, ContentPresenter áp dụng DataTemplate đó vào thuộc tính Nội dung và kết quả là UIElement và các phần tử con của nó, nếu có, được hiển thị.
  • Nếu Nội dung là đối tượng UIElement, UIElement được hiển thị. Nếu UIElement đã có một phụ huynh, một ngoại lệ xảy ra.
  • Nếu có một TypeConverter chuyển đổi loại nội dung thành UIElement, thì ContentPresenter sử dụng TypeConverter đó và kết quả UIElement được hiển thị.
  • Nếu có một TypeConverter chuyển đổi loại nội dung thành chuỗi, ContentPresenter sử dụng TypeConverter đó và tạo một TextBlock để chứa chuỗi đó. TextBlock được hiển thị.
  • Nếu nội dung là XmlElement, giá trị của thuộc tính InnerText được hiển thị trong một TextBlock.
  • ContentPresenter gọi phương thức ToString trên Nội dung và tạo một TextBlock để chứa chuỗi được ToString trả về. TextBlock được hiển thị.

Trong trường hợp của lớp TextBlock, bạn có tùy chọn để hoặc thiết lập các Text tài sản, hoặc thiết lập các Inlines tài sản. Thiết lập Text sẽ chỉ hiển thị văn bản. Đặt Inlines (là mặc định nếu bạn đặt nội dung bên trong phần thân của thẻ xaml) cho phép bạn định dạng văn bản của mình. Ví dụ: bạn có thể sử dụng Run với FontWeight được đặt thành Bold để làm cho một từ hoặc cụm từ nhất định được in đậm trong một câu. Bạn có thể sử dụng LineBreak để chèn một dòng mới. Bạn thậm chí có thể sử dụng InlineUIContainer để chèn các phần tử giao diện người dùng tùy chỉnh trong văn bản. Bất kỳ thứ gì xuất phát từ lớp Inline đều có thể đi vào bộ sưu tập này.

TextBlock dành cho các bit văn bản được định dạng đơn giản. Nếu bạn muốn các tính năng phong cách tài liệu mạnh hơn nữa, bạn có thể xem xét FlowDocument, được sử dụng bởi các điều khiển như RichTextBox, FlowDocumentScrollViewerFlowDocumentReader.

Theo như sự khác biệt giữa <TextBlock Text="something" /><TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>, thực sự không có sự khác biệt. Đó chỉ đơn giản là hai cách khác nhau mà bạn có thể thiết lập thuộc tính trên một cái gì đó trong một tập tin xaml. Phiên bản thứ hai thường chỉ được sử dụng khi bạn cần phải xác định các yếu tố bổ sung bên trong setter.

4

Một từ ngắn trên 'yếu tố tài sản'

Đây chỉ là một nhận xét thêm về Xaviers câu trả lời tuyệt vời.

Trong thực tế không có nhiều khác biệt giữa:

<TextBlock Text="something" /> 

<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock> 

Thats vì Text tài sản là loại String mà là một kiểu đơn giản mà có thể được đặt trực tiếp như Text="something".

Cú pháp thứ hai trong ví dụ trên được gọi là 'các phần tử thuộc tính'. Nó thường được sử dụng khi đặt thuộc tính của một phần tử thành một loại phức tạp.

Ví dụ:

<Button> 
    <Button.Content> 
    <Rectangle Height="20", Width="20", Fill="Black"/> 
    </Button.Content> 
</Button> 

Trong ví dụ này, bạn có thể thiết lập các propably 'Rectangle' trực tiếp mà không sử dụng Button.Content, nhưng đối với ví dụ khác cú pháp có thể được sử dụng để thiết lập một thuộc tính của một loại phức tạp.

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