WPF 4.0. Что нового? Часть 2.

    • .NET
    • .NET 4.0
    • WPF
    • WPF 4
    • Visual Studio 2010
  • modified:
  • reading: 3 minutes

В продолжении статьи о нововведениях в WPF 4.0. Так же хочу заметить, что появился перевод на русский язык статьи Скотта Гу о WPF4.

Графика

Шейдеры

Как и должно быть: новый WPF и поддержка новых шейдеров, теперь поддерживаются шейдеры версии 3.0, так что берем в руки класс ShaderEffect, изучаем и на примерах строим свои эффекты. Опять же, нужно не забывать, что существуют компьютеры и без поддержки шейдеров версии 3.0 – для этого введен дополнительный набор методов для определения версии шейдеров, поддерживаемых системой, в классе RenderCapability. К сожалению, ни разу еще не писал никаких эффектов, вроде и не за чем было, но в будущем, думаю, нужно будет это исправить и попробовать что-то сделать интересного. В сети встречал достаточно примеров написанных эффектов, один из них был Grayscale эффект, который из цветной фотографии делал ч/б – использовали в проекте для toolbar’a – все иконки делали ч/б, и только при наведении они приобретали цвет (позаимствовали идею у Photoshop).

Кеширование графики

С графикой также связаны нововведения, которые позволят повысить производительность наших приложений. Теперь у класса UIElement есть свойство CacheMode, которому мы можем установить объект типа BitmapCache. Полезно это будет, в основном, когда ваше приложение использует множество элементов, описанных декларативно при помощи Path, тогда вы можете задать кеш для этого элемента, с указанием масштаба при котором данный векторный рисунок прорендериться. Для пробы советую посмотреть пример на MSDN “How to: Improve Rendering Performance by Caching an Element”, где в векторе нарисована алюминиевая банка, у которой постоянно меняют масштаб. Основа этого примера в строках

<!-- //////////////////////////////////////////////////////////////// -->
<!-- // The following XAML creates a BitmapCache with default      // -->
<!-- // properties and assigns it as the CacheMode for the canvas. // -->
<!-- //////////////////////////////////////////////////////////////// -->
<Canvas.CacheMode>
    <BitmapCache EnableClearType="False" 
                 RenderAtScale="1" 
                 SnapsToDevicePixels="False"  />
</Canvas.CacheMode>

Проще некуда, осталось только найти места в приложениях, где это может повысить производительность. Так же знакомимся с классом BitmapCacheBrush, который также должен нам значительно повысить производительность приложения при должном использовании. Он нам понадобиться в случае, если мы какой-то элемент отображаем несколько раз в одном окне. Например, это может быть иконка в DataGridView: теперь ее один раз можно отрендерить, сделать кеш при помощи BitmapCache в ресурсах, а затем просто продублировать уже закешированную картинку при помощи BitmapCacheBrush. Опять же, на MSDN есть хороший пример на эту тему “How to: Use a Cached Element as a Brush”.

Layout Rounding

Следующим нововведением в WPF является LayoutRounding. Новое в WPF, но уже старое в Silverlight. Осталось только почувствовать чем UseLayoutRounding лучше SnapsToDevicePixels. Чтобы прочувствовать различие, можно взять пример с линиями из MSDN и поиграться с ним, выставляя эти свойства поочередно в True и False. Есть подозрение, что UseLayoutRounding забивает SnapsToDevicePixels, так как при выставлении первого в True, изменение значения второго уже ни на что не влияет. Вообще идея двух этих свойств разная, но эффект иногда получается один и тот же, но мне кажется что в разработке лучше привязываться к Layout Rounding и использовать только его, он более интуитивно понятен. Вообще вот здесь WPF Text Blog - Layout Rounding хорошо описано как и когда его следует применять.

Новые функции для анимации

WPF 4 дополнили новым набором функций для анимации (посмотреть весь набор можно на MSDN – базовый класс EasingFunctionBase). Посмотреть весь набор функций для поведения можно на примере, приведенным тут - New WPF Features: Easing Functions, напоминает огромный набор анимации в PowerPoint, главное использовать с умом. Насколько я понимаю – раз есть базовый класс, то можно, скорее всего, сделать и свою функцию.

See Also