Новые возможности WPF версии 4.5

Данный раздел содержит сведения о новых и улучшенных функциях Windows Presentation Foundation (WPF) версии 4.5.

Этот раздел состоит из следующих подразделов.

Элемент управления ленты

WPF 4.5 содержит элемент управления Ribbon, который включает в себя панель быстрого доступа, меню приложения и вкладки. Дополнительные сведения см. в разделе Общие сведения об ленте.

Повышение производительности при отображении больших наборов сгруппированных данных

Когда подмножество элементов пользовательского интерфейса создается из большего количества элементов данных в зависимости от того, какие из элементов отображаются на экране, происходит виртуализация пользовательского интерфейса. VirtualizingPanel определяет присоединенное свойство IsVirtualizingWhenGrouping, обеспечивающее виртуализацию пользовательского интерфейса для сгруппированных данных. Дополнительные сведения о группировании данных см. в разделе "Практическое руководство. Сортировка и группы данных с помощью представления в XAML". Дополнительные сведения о виртуализации сгруппированных данных см. в описании присоединенного свойства IsVirtualizingWhenGrouping.

Новые возможности VirtualizingPanel

  1. Вы можете указать, должна ли панель VirtualizingPanel, например VirtualizingStackPanel, отображать частичные элементы, используя присоединенное свойство ScrollUnit. Если ScrollUnit имеет значение Item, VirtualizingPanel отображает только полностью видимые элементы. Если ScrollUnit имеет значение Pixel, VirtualizingPanel может отобразить частично видимые элементы.

  2. Вы можете указать размер кэша до и после окна просмотра при виртуализации VirtualizingPanel с помощью присоединенного свойства CacheLength. Кэш — это объем области, расположенной выше или ниже окна просмотра, элементы в котором не являются виртуальными. Используя кэш, чтобы предотвратить создание элементов пользовательского интерфейса по мере их прокрутки, можно повысить производительность. Кэш заполняется с низким приоритетом, так что приложение не перестает отвечать на запросы во время этой операции. Свойство VirtualizingPanel.CacheLengthUnit определяет единицу измерения, которую использует VirtualizingPanel.CacheLength.

Привязка к статическим свойствам

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

  • public static event EventHandler MyPropertyChanged;

  • public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

Обратите внимание, что в первом случае класс предоставляет статическое событие с именем имя_свойстваChanged, которое передает EventArgs обработчику событий. Во втором случае класс предоставляет статическое событие с именем StaticPropertyChanged, которое передает PropertyChangedEventArgs обработчику событий. Класс, реализующий статическое свойство, может выдавать уведомления об изменениях в свойства, используя любой из этих методов.

Доступ к коллекциям в потоках без пользовательского интерфейса

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

Синхронная и асинхронная проверка данных

Интерфейс INotifyDataErrorInfo позволяет классами сущностей данных реализовывать пользовательские правила проверки и предоставлять результаты проверки асинхронно. Этот интерфейс также поддерживает объекты специальных ошибок, нескольких ошибок для каждого свойства, ошибок нескольких свойств и ошибок на уровне сущности. Дополнительные сведения см. в разделе INotifyDataErrorInfo.

Автоматическое обновление источника привязки данных

Если для обновления источника данных используется привязка данных, указать время, которое должно пройти после изменения свойства на целевом объекте, прежде чем источник будет обновлен, можно с помощью свойства Delay. Допустим, у вас есть Slider с двухсторонней привязкой данных свойства Value к свойству объекта данных и свойством UpdateSourceTrigger, имеющим значение PropertyChanged. В этом примере при перемещении Slider источник обновляется для каждого пикселя, перемещаемого Slider. Обычно исходному объекту значение ползунка требуется только в том случае, если перестает изменяться Value ползунка. Чтобы предотвратить слишком частое обновление источника, с помощью Delay укажите, что источник не следует обновлять, пока не пройдет определенное количество времени после того, как бегунок перестанет перемещаться.

Привязки к типам, реализующим ICustomTypeProvider

WPF поддерживает привязку данных к объектам, реализующим ICustomTypeProvider, также известным как пользовательские типы. Пользовательские типы можно использовать в следующих случаях:

  1. В качестве PropertyPath в привязке данных. Например, свойство Path объекта Binding может ссылаться на свойство пользовательского типа.

  2. В качестве значения свойства DataType.

  3. В качестве типа, определяющего автоматически создаваемые столбцы в DataGrid.

Получение сведений о привязке данных из выражения привязки

В некоторых случаях при получении BindingExpression объекта Binding вам могут потребоваться сведения об исходном и целевом объектах привязки. Новые интерфейсы API позволят вам получить исходный и целевой объект или связанное свойство. Если у вас есть BindingExpression, воспользуйтесь указанными ниже API для получения сведений о целевом и исходном объектах.

Чтобы найти это значение привязки Используйте этот API
Целевой объект BindingExpressionBase.Target
Целевое свойство BindingExpressionBase.TargetProperty
Исходный объект BindingExpression.ResolvedSource
Исходное свойство BindingExpression.ResolvedSourcePropertyName
Относится ли BindingExpression к BindingGroup BindingExpressionBase.BindingGroup
Владелец объекта BindingGroup Owner

Проверка наличия допустимого объекта DataContext

В некоторых случаях DataContext контейнера элементов в ItemsControl отключается. Контейнер элементов — это элемент пользовательского интерфейса, который отображает элемент в ItemsControl. Если ItemsControl привязан к какой-либо коллекции, для каждого элемента создается контейнер. В некоторых случаях контейнеры элементов удаляются из визуального дерева. Как правило, это происходит в следующих двух случаях: при удалении элемента из базовой коллекции и при включении виртуализации для ItemsControl. В этих случаях в качестве свойства DataContext контейнера элементов задается сигнальный объект, возвращаемый статическим свойством BindingOperations.DisconnectedSource. Прежде чем обращаться к DataContext контейнера элементов, убедитесь, что DataContext аналогичен объекту DisconnectedSource.

Изменение расположения данных по мере изменения их значений (формирование данных в реальном времени)

Коллекцию данных можно группировать, сортировать и фильтровать. WPF 4.5 позволяет изменять порядок данных при их изменении. Допустим, например, что приложение формирует список акций на фондовой бирже с помощью DataGrid и сортирует акции по стоимости. Если включена динамическая сортировка CollectionView, положение акции в DataGrid изменится, если ее стоимость увеличится или уменьшится относительно других акций. Дополнительные сведения см. в описании интерфейса ICollectionViewLiveShaping.

Улучшенная поддержка установления слабой ссылки на событие

Реализация шаблона слабых событий стала проще, поскольку подписчики на события теперь могут принимать в ней участие без реализации дополнительного интерфейса. Универсальный класс WeakEventManager также позволяет подписчикам участвовать в шаблоне слабых событий, если выделенный WeakEventManager не существует для определенного события. Дополнительные сведения см. в разделе Шаблоны слабых событий.

Новые методы для класса Dispatcher

Класс Dispatcher определяет новые методы для синхронных и асинхронных операций. Синхронный метод Invoke определяет перегрузки, принимающие в качестве параметра Action или Func<TResult>. Новый асинхронный метод InvokeAsync также принимает Action или Func<TResult> в качестве параметра обратного вызова и возвращает DispatcherOperation или DispatcherOperation<TResult>. Классы DispatcherOperation и DispatcherOperation<TResult> определяют свойство Task. При вызове InvokeAsync можно использовать ключевое слово await с объектом DispatcherOperation или связанным объектом Task. Если необходимо синхронное ожидание объекта Task, возвращаемого DispatcherOperation или DispatcherOperation<TResult>, вызывайте метод расширения DispatcherOperationWait. Если операция находится в очереди вызывающего потока, вызов метода Task.Wait приведет к взаимоблокировке. Дополнительные сведения об использовании объекта Task для выполнения асинхронных операций см. в разделе Параллелизм задач (библиотека параллельных задач).

Расширения разметки для событий

WPF 4.5 поддерживает расширения разметки для событий. Несмотря на то, что WPF не определяет расширение разметки для применения с событиями, третьи стороны могут создавать расширение разметки, которое можно использовать с событиями.

См. также