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


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

Присоединенное свойство — это концепция 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.LeftProperty. Затем 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, используйте специальный синтаксис, который внедряет кодовый стиль, полностью квалифицированное using: объявление внутри квадратных скобок ("[]"), чтобы создать преднамеренный разрыв области. Например, если существует элемент <TextBlock x:Uid="Title" />, то в файле ресурсов ключ, предназначенный для целевого значения Canvas.Top этого экземпляра, будет Title.\[using:Microsoft.UI.Xaml.Controls\]Canvas.Top. Дополнительные сведения о файлах ресурсов и XAML см. в разделе "Локализация строк" в пользовательском интерфейсе.