Каковы ваши «лучшие практики» для написания пользовательских элементов управления в WPF - PullRequest
3 голосов
/ 20 августа 2009

Я начал писать некоторые пользовательские элементы управления для очень визуального проекта. Мне было интересно, каковы ваши «лучшие практики» при написании пользовательских элементов управления WPF?

Ответы [ 5 ]

3 голосов
/ 01 июля 2012

Если вы хотите, чтобы ваш пользовательский элемент управления поддерживал прямой контент, например:

<CustomObject>
    Direct content example 1
</CustomObject>

<!-- or -->

<CustomObject>
    <Button Content="Direct content example 2" />
</CustomObject>

Затем вам нужно использовать ContentPropertyAttribute, который сообщает WPF, какое свойство фактически устанавливается, когда вы пишете xaml следующим образом.

Атрибут можно использовать так:

[ContentProperty("NameOfProperty")]
public class CustomObject
{
    [...]

ContentControl использует этот атрибут для установки свойства Content, но обратите внимание, что свойство может вызываться как угодно; например, WPF TextBox использует этот атрибут для установки свойства Text.

Е.Г.

[ContentProperty("Text")]

Свойство также не должно быть свойством зависимостей (см. Пример документации MSDN для подтверждения этого).

Наконец, этот атрибут относится только к синтаксическому анализатору xaml, а не к ContentControl и может использоваться с любым типом, который можно увидеть из приведенного выше примера TextBox (TextBox не является производным от ContentControl).

3 голосов
/ 20 августа 2009

Оставьте имена свойств такими же, как имена свойств для встроенных элементов управления, если вы можете сделать это без изменения их значения.

например. если у вас есть пользовательский элемент управления CustomerDisplayer, который не вызывает список клиентов Customer, назовите его ItemsSource.

Поначалу это может показаться нелогичным, но в долгосрочной перспективе это избавит вас от головной боли, потому что будущие программисты могут сделать много предположений о том, как будет действовать свойство с именем ItemsSource, которое они не смогут сделать в отношении свойства Customers.

2 голосов
/ 20 августа 2009

Убедитесь, что элемент управления может быть изменен и изменен без изменения способа управления. Не заставляйте элемент управления предполагать, что Listbox и Button находятся на одной панели или что даже есть Listbox или Button. Ознакомьтесь с MSDN статьей об элементе управления , где приведены некоторые рекомендации, как это сделать.

0 голосов
/ 01 июля 2012

Узнайте, как использовать свойства зависимостей и перенаправленные события (и как они работают), чтобы вы могли эффективно использовать их в своем собственном управлении.

Оба эти типа предоставляют сервисы для интеграции вашего управления с системами, встроенными в WPF.

Используя эти две функции в пользовательских элементах управления, вы получите следующие преимущества:

  1. Свойства зависимостей обеспечивают поддержку привязки данных, анимации и могут использоваться в стилях.

  2. Направленные события могут распространяться через визуальное дерево, что означает, что другие элементы могут обрабатывать события.

0 голосов
/ 01 июля 2012

Некоторые элементы управления содержимым зависят от наличия других элементов управления в их ControlTemplate. Обычно это должно быть задокументировано с использованием атрибута TemplatePart.

Элемент управления Combobox, например, зависит от наличия элементов управления TextBox и Popup в его шаблоне.

Это было бы задокументировано, поместив атрибут в класс следующим образом:

[TemplatePart(name="PART_EditableTextBox", type=typeof(TextBox))]
[TemplatePart(name="PART_Popup", type=typeof(Popup))]
public class Combobox : Selector
{
    [...]

Соглашение о присвоении имен "PART_controlIdentifier".

Соответствующим элементам будут присвоены те же имена в шаблоне элемента управления, чтобы их можно было найти в методе OnApplyTemplate.

Это позволяет элементу управления подключаться к событиям, устанавливать свойства и вызывать методы для элементов управления, содержащихся в шаблоне.

Этот атрибут предназначен для документирования, чтобы люди, разрабатывающие пользовательские шаблоны элементов управления (и такие инструменты, как Expression Blend), знали, что элемент управления зависит от существования другого.

...