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

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

Необходимые компоненты

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

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

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

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

Примечание.

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

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

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

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

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

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

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

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

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

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

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

Существует два способа задать присоединенное свойство в коде: использовать 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)". Дополнительные сведения см. в разделе "Синтаксис пути свойства".

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

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

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