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


Атрибут x:Shared

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

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

<ResourceDictionary>
  <object x:Shared="false".../>
</ResourceDictionary>

Замечания

x:Shared сопоставляется с пространством имен XAML языка XAML и распознается как допустимый элемент языка XAML службами XAML .NET и их средствами чтения XAML. Однако указанные возможности x:Shared применимы только к приложениям WPF и средству синтаксического анализа XAML WPF. В WPF x:Shared полезен в качестве атрибута, только если он применяется к объекту, который существует в ResourceDictionary WPF. Другие способы использования не вызывают исключения синтаксического анализа или другие ошибки, однако не оказывают никакого влияния.

Смысл x:Shared в спецификации языка XAML не указан. Другие реализации XAML, такие как те, которые основаны на службах XAML .NET, не обязательно обеспечивают поддержку совместного использования ресурсов. Такие реализации XAML могут обеспечить аналогичное поведение на вспомогательной платформе, где также использовались значения x:Shared.

В WPF условие по умолчанию x:Shared для ресурсов равно true. Такое условие означает, что любой запрос ресурса всегда возвращает один и тот же экземпляр.

Изменение объекта, возвращаемого через API ресурсов, например, FindResource, или объекта непосредственно в пределах ResourceDictionary приводит к изменению исходного ресурса. Если ссылки на этот ресурс были динамическими, его потребители получают измененный ресурс.

Если ссылки на ресурс были статическими, его изменения после времени обработки XAML не имеют значения. Дополнительные сведения о статических и динамических ссылках на ресурсы см. в разделе Общие сведения о ресурсах XAML (WPF .NET).

Явное указание x:Shared="true" применяется редко, так как это значение уже используется по умолчанию. В объектной модели WPF нет прямого эквивалента кода для x:Shared. Его можно указать только при использовании XAML и необходимо обрабатывать либо с помощью поведения WPF по умолчанию, либо в потоке промежуточном узла XAML в пути загрузки, если обработка осуществляется с помощью служб XAML .NET и их средств чтения XAML.

Сценарий для x:Shared="false" заключается в том, чтобы определить производный класс FrameworkElement или FrameworkContentElement как ресурс, а затем ввести ресурс элемента в модель содержимого. x:Shared="false" позволяет несколько раз вводить ресурс элемента в одной коллекции (например, UIElementCollection). Без x:Shared="false" это не работает, так как коллекция обеспечивает уникальность ее содержимого. Однако поведение при использовании x:Shared="false" создает другой идентичный экземпляр ресурса вместо возврата того же экземпляра.

Другим сценарием для x:Shared="false" является ситуация, когда вы используете ресурс Freezable для значений анимации, но хотите изменять ресурс для отдельных анимаций.

Обработка строк false выполняется без учета регистра.

В WPF x:Shared является действительным действует только при следующих условиях:

  • ResourceDictionary, содержащий элементы с x:Shared, должен быть скомпилирован. ResourceDictionary не может находиться в свободном XAML или использоваться для тем.

  • ResourceDictionary, содержащий элементы, не должен быть вложен в другой ResourceDictionary. Например, x:Shared невозможно использовать для элементов в ResourceDictionary, уже находящемся в Style, который уже является элементом ResourceDictionary.

См. также