Поделиться через


Общие сведения о присоединенных свойствах

Концепция присоединенного свойства относится к XAML. Присоединенные свойства позволяют задавать дополнительные пары свойств и значений для объекта, но свойства не являются частью исходного определения объекта. Присоединенные свойства обычно определяются как специализированная форма свойства зависимостей, которая не имеет обычной оболочки свойств в объектной модели типа владельца.

Предпосылки

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

Присоединенные свойства в XAML

В XAML необходимо задать присоединенные свойства с помощью синтаксиса AttachedPropertyProvider.PropertyName. Ниже приведен пример настройки Canvas.Left в XAML.

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

Замечание

Мы просто используем Canvas.Left в качестве примера присоединенного свойства, не полностью объясняя, почему вы используете его. Если вы хотите узнать больше о назначении Canvas.Left и о том, как Canvas управляет своими дочерними элементами макета, ознакомьтесь со справочным разделом Canvas или устройте макеты с использованием XAML в разделе .

Зачем использовать присоединенные свойства?

Присоединенные свойства — это способ избежать соглашений о кодировании, которые могут препятствовать обмену информацией между различными объектами во время выполнения. Конечно, можно поместить свойства в общий базовый класс, чтобы каждый объект мог просто получить и задать это свойство. Но в конечном итоге большее количество сценариев, в которых может потребоваться сделать это, будет раздувать базовые классы с общими свойствами. Это может даже привести к ситуациям, когда из сотен потомков только двое пытаются использовать свойство. Это не хороший дизайн класса. Для решения этой проблемы концепция присоединенного свойства позволяет объекту назначать значение для свойства, которое не определяет собственная структура классов. Определяющий класс может считывать значение из дочерних объектов во время выполнения после создания различных объектов в дереве объектов.

Например, дочерние элементы могут использовать присоединенные свойства для информирования родительского элемента о том, как они должны быть представлены в пользовательском интерфейсе. Это относится к присоединенному свойству Canvas.Left. Canvas.Left создается как присоединенное свойство, так как оно устанавливается для элементов, содержащихся в элементе Canvas, а не непосредственно на самом элементе Canvas. Затем любой возможный дочерний элемент использует Canvas.Left и Canvas.Top для указания смещения макета в родительском элементе контейнера макета Canvas. Присоединенные свойства позволяют работать без загромождения объектной модели базового элемента с большим количеством свойств, которые применяются только к одному из множества возможных контейнеров макетов. Вместо этого многие контейнеры макетов реализуют собственный набор присоединенных свойств.

Для реализации присоединенного свойства класс Canvas определяет статическое поле DependencyProperty с именем Canvas.LeftProper ty. Затем Canvas предоставляет методы SetLeft и GetLeft в качестве общедоступных методов доступа к присоединенному свойству, чтобы обеспечить установку в XAML и доступ к значению во время выполнения. Для XAML и для системы свойств зависимостей этот набор API удовлетворяет шаблону, который включает определенный синтаксис XAML для присоединенных свойств и сохраняет значение в хранилище свойств зависимостей.

Как тип владения использует присоединенные свойства

Несмотря на то, что присоединенные свойства могут быть установлены на любом элементе XAML (или любом базовом DependencyObject), это не обязательно означает, что установка свойства приводит к заметному результату или что значение вообще когда-либо используется. Тип, определяющий присоединенное свойство, обычно следует одному из следующих сценариев:

  • Тип, определяющий присоединенное свойство, является родительским в связи с другими объектами. Дочерние объекты задают значения для присоединенного свойства. Тип владельца присоединенного свойства имеет некоторое врожденное поведение, которое выполняет итерацию по его дочерним элементам, получает значения и действует на эти значения в какой-то момент времени существования объекта (действие макета, SizeChangedи т. д.)
  • Тип, определяющий присоединенное свойство, используется в качестве дочернего элемента для различных возможных родительских элементов и моделей содержимого, но сведения не обязательно являются сведениями о макете.
  • Присоединенное свойство сообщает сведения о службе, а не другому элементу пользовательского интерфейса.

Для получения дополнительных сведений об этих сценариях и типах владения см. раздел "Дополнительные сведения о Canvas.Left" в настраиваемых присоединенных свойствах.

Присоединенные свойства в коде

Присоединенные свойства не имеют типичных оболочки свойств для простого получения и задания доступа, как и другие свойства зависимостей. Это связано с тем, что присоединенное свойство не обязательно является частью объектной модели с центром кода для экземпляров, где задано свойство. (Это допустимо, хотя и редко, определить свойство, которое является как присоединенным свойством, которое другие типы могут задать для себя, так и имеет также обычное использование свойства в типе-владельце.)

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

Использование системы свойств

Присоединенные свойства среды выполнения Windows реализуются как свойства зависимостей, чтобы значения могли храниться в общем хранилище свойств зависимостей системой свойств. Поэтому присоединенные свойства выставляют идентификатор зависимого свойства в классе-владельце.

Чтобы задать присоединенное свойство в коде, вызовите метод SetValue и передайте поле DependencyProperty , которое служит идентификатором для этого присоединенного свойства. (Вы также передаете значение для установки.)

Чтобы получить значение присоединенного свойства в коде, вызовите метод GetValue , снова передав поле DependencyProperty , которое служит идентификатором.

Использование паттерна доступа XAML

Обработчик XAML должен иметь возможность задавать значения присоединенного свойства при анализе XAML в дереве объектов. Тип владельца присоединенного свойства должен реализовывать выделенные методы доступа, именованные в форме GetPropertyName и SetPropertyName. Эти методы выделенного доступа также являются одним из способов получения или задания присоединенного свойства в коде. С точки зрения кода присоединенное свойство похоже на поддерживающее поле, которое имеет методы вместо аксессоров свойства, и это поддерживающее поле может существовать в любом объекте, а не должно быть явно определено.

В следующем примере показано, как задать присоединенное свойство в коде с помощью API доступа XAML. В этом примере myCheckBox является экземпляром класса CheckBox. Последняя строка — это код, который фактически задает значение; строки перед этим просто устанавливают экземпляры и их отношения с родительским дочерним элементом. Последняя строка без комментариев — это синтаксис, если используется система свойств. Закомментированная последняя строка — это синтаксис, если вы используете шаблон доступа XAML.

    Canvas myC = new Canvas();
    CheckBox myCheckBox = new CheckBox();
    myCheckBox.Content = "Hello";
    myC.Children.Add(myCheckBox);
    myCheckBox.SetValue(Canvas.TopProperty,75);
    //Canvas.SetTop(myCheckBox, 75);
    Dim myC As Canvas = New Canvas()
    Dim myCheckBox As CheckBox= New CheckBox()
    myCheckBox.Content = "Hello"
    myC.Children.Add(myCheckBox)
    myCheckBox.SetValue(Canvas.TopProperty,75)
    ' Canvas.SetTop(myCheckBox, 75)
Canvas myC;
CheckBox myCheckBox;
myCheckBox.Content(winrt::box_value(L"Hello"));
myC.Children().Append(myCheckBox);
myCheckBox.SetValue(Canvas::TopProperty(), winrt::box_value(75));
// Canvas::SetTop(myCheckBox, 75);
    Canvas^ myC = ref new Canvas();
    CheckBox^ myCheckBox = ref new CheckBox();
    myCheckBox->Content="Hello";
    myC->Children->Append(myCheckBox);
    myCheckBox->SetValue(Canvas::TopProperty,75);
    // Canvas::SetTop(myCheckBox, 75);

Настраиваемые присоединенные свойства

Примеры кода для определения пользовательских присоединенных свойств и дополнительная информация о сценариях их использования представлены в разделе пользовательские присоединенные свойства.

Специальный синтаксис для ссылок на присоединенные свойства

Точка в названии присоединенного свойства является ключевым элементом шаблона идентификации. Иногда возникает неоднозначность, когда синтаксис или ситуация рассматривает точку в другом значении. Например, точка рассматривается как перемещение в объектной модели по пути привязки. В большинстве случаев с такой неоднозначностью существует специальный синтаксис для присоединенного свойства, который позволяет внутренней точке по-прежнему анализироваться как владелец .свойству разделитель присоединенного свойства.

  • Чтобы указать присоединенное свойство в рамках целевого пути для анимации, заключите имя присоединенного свойства в скобки ("()"), например "(Canvas.Left)". Для получения дополнительной информации см. синтаксис пути-свойства.

Предупреждение

Существующее ограничение реализации XAML среды выполнения Windows заключается в том, что нельзя анимировать пользовательское прикрепленное свойство.

  • Чтобы указать присоединенное свойство в качестве целевого свойства для ссылки на ресурсы из файла ресурсов в x:Uid, используйте специальный синтаксис, который внедряет стиль кода, полностью квалифицированный с помощью: объявление в квадратных скобках ("[]") для создания преднамеренного разрыва области. Например, если существует элемент <TextBlock x:Uid="Title" />, ключ ресурса в файле ресурсов, который ориентирован на значение Canvas.Top в этом экземпляре, имеет вид "Title.[using:Windows.UI.Xaml.Controls]Canvas.Top". Дополнительные сведения о файлах ресурсов и XAML см. в кратком руководстве по быстрым настройкам: перевод ресурсов пользовательского интерфейса .