Câu trả lời:
ContentControl
là một lớp cơ sở cho các điều khiển có chứa các phần tử khác và có Content
-property (ví dụ Button
:).
ContentPresenter
được sử dụng bên trong các mẫu điều khiển để hiển thị nội dung.
ContentControl
, khi được sử dụng trực tiếp (được cho là được sử dụng làm lớp cơ sở), có một mẫu điều khiển sử dụng ContentPresenter để hiển thị nội dung của nó.
Quy tắc ngón tay cái của tôi (không áp dụng trong mọi trường hợp, sử dụng phán đoán của bạn):
ControlTemplate
Sử dụng bên trongContentPresenter
ControlTemplate
(bao gồm DataTemplate
và các mẫu bên ngoài) cố gắng không sử dụng bất kỳ mẫu nào trong số chúng, nếu bạn cần, bạn phải thíchContentPresenter
ContentControl
nếu bạn đang tạo một điều khiển "không nhìn" tùy chỉnh mà lưu trữ nội dung và bạn không thể nhận được kết quả tương tự bằng cách thay đổi mẫu của điều khiển hiện có (điều này cực kỳ hiếm).ContentPresenter thường được sử dụng trong ControlTemplate, như một trình giữ chỗ để nói "đặt nội dung thực tế ở đây".
ContentControl có thể được sử dụng ở bất cứ đâu, không nhất thiết phải trong một mẫu. Nó sẽ chọn bất kỳ DataTemplate nào được xác định cho loại nội dung được gán cho nó
Gần đây tôi đã viết một bài đăng trên blog của mình về hai điều khiển này:
ContentPresenter vs ContentControl (EDIT: Liên kết bị hỏng được thay thế bằng phiên bản lưu trữ.)
Các ContentPresenter.ContentSource là những gì thực sự làm cho sự khác biệt lớn nhất giữa hai lớp. Thuộc tính ContentSource chỉ có ý nghĩa trong ControlTemplate; nó xác định thuộc tính TemplatedParent nào mà nội dung sẽ được ánh xạ. Ví dụ: nếu một điều khiển chứa thuộc tính phụ thuộc MyProperty1
, thì chúng ta có thể tìm thấy các điều sau trong phạm vi của nó ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
Nội dung của ContentPresenter sẽ nhận được giá trị của MyProperty1
.
Xin lưu ý rằng nếu tên của tài sản là Content
, không cần chỉ định ContentSource
vì đó là giá trị mặc định.
Đối với những người biết angularJs: điều này tương tự như mecanism xuyên.
Đó là một câu hỏi cũ nhưng tôi vừa hoàn thành việc phát triển một Điều khiển Ngói hoạt hình, mẫu dựa trên một ứng dụng phổ quát, hãy xem mã này từ SDK Điện thoại WP7 / 8 cũ:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Tại đây bạn có thể thấy ContentControl là Container và Presenter để hiển thị nội dung. Trong hầu hết các trường hợp, ControlTemplate sẽ là Container nhưng nếu bạn muốn trong ControlTemplate
một container khác, bạn có thể đặt một Container bổ sung: ContentControl
trong đó và để trình bày nội dung một cách riêng biệt ContentPresenter
. Nếu bạn không cần một container riêng thì chỉ cần sử dụng ControlTemplate
vàControlPresenters
để hiển thị các khối nội dung ít nhất đó là những gì mà những người ở Microsoft đã làm khi họ phát triển SDK WP7 / 8. ContentControl cũng có thể được sử dụng để hiển thị nội dung nhưng sau đó nó đóng vai trò là người chứa và người trình bày. Vì vậy, trong mã mẫu trên mục đích của nó được chia trong Container và Presenter. Trong các mẫu động, bạn có thể hiển thị vùng chứa (nó có thể có nền trống hoặc thứ gì đó chưa có) và sau đó tự động điền nó với nội dung của người trình bày. Một container có kích thước (chiều rộng, chiều cao, v.v.), bạn đặt các thuộc tính đó vào điều khiển container và trình bày nội dung trên nó. Trong mẫu, ContentControl xác định những gì phải được thực hiện với nội dung của người trình bày.
Đôi khi một ví dụ dễ hơn thuật ngữ lý thuyết. Trong một trang web MS (Di chuyển xuống dưới cùng: http://msdn.microsoft.com/en-us/l Library / system.windows.controls.contentpresenter (v = vs.110 ) .aspx ), nó sử dụng một nút như một ví dụ. Nút có ContentControl, cho phép bạn đặt một điều khiển hoặc điều khiển tùy chỉnh có thể là Hình ảnh, Văn bản, CheckBox, StackPanel, Grid, bất cứ điều gì.
Sau khi tùy chỉnh Nút, giờ đây trên Xaml, bạn có thể viết
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
Trong mã ví dụ trên, "my: Button.Content" là ContentControl. AnotherControl sẽ là nơi bạn đã chỉ định nơi ContentPresenter đang ở.
Tương tự, khi so sánh TextBox và TextBlock, TextBox có ContentPresenter để bạn nhét vào đó giống như ví dụ về Nút trên trong khi TextBlock không có. TextBlock chỉ cho phép bạn nhập văn bản.
Button
không có [ ContentControl
] (msdn.microsoft.com/en-us/l Library / system.windows.controls.contentcontrol (v = vs.110) .aspx), đó là một (kế thừa từ) ContentControl
. Các Button
có một ContentPresenter
. Lưu ý rằng bạn có thể làm điều đó với tiêu chuẩn Button
, không cần phải tùy chỉnh nó.
ContentPresenter
, ContentControl
không thể sử dụng tốt như vậy ControlTemplate
để hiển thị nội dung của Button
. Như vậy, nó không trả lời câu hỏi.