Экспорт рисунка

30

Хотя во всех примерах, представленных в предыдущих статьях, рисунки объявлялись встроенным образом, общепринятый подход предусматривает помещение некоторой части содержимого в словарь ресурсов, чтобы его можно было повторно использовать в разных местах приложения (а модифицировать — только в одном). Как разнести разметку по ресурсам — дело ваше, но чаще всего сохраняется словарь, заполненный объектами DrawingImage или DrawingBrush. Можно также дополнительно выделить объекты Geometry и сохранить их как отдельные ресурсы. (Это удобно, когда одна и та же геометрия применяется в более чем одном рисунке, но с разными цветами.)

Разумеется, лишь очень немногие разработчики станут кодировать рисунки вручную. Скорее, они воспользуются специальными инструментами графического дизайна, которые экспортируют необходимое содержимое в XAML. Большинство инструментов дизайна не поддерживают пока экспорт в XAML, хотя есть множество подключаемых модулей и конвертеров, которые заполняют пробел. Ниже представлены некоторые примеры:

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

Первая причина в том, что многие программы позволяют выбирать, как экспортировать рисунок — в виде комбинации отдельных элементов в Canvas или же в виде коллекции ресурсов DrawingBrush или DrawingImage. Обычно первый вариант выбирается по умолчанию, поскольку сохраняет больше возможностей. Однако в случае большого количества сложных рисунков или при желании сэкономить память, расходуемую на статическую графику вроде пиктограмм кнопок, намного лучше иметь дело с ресурсами DrawingBrush или DrawingImage.

Еще хорошо то, что эти форматы отделены от остального пользовательского интерфейса, так что их легко впоследствии обновлять, если возникнет необходимость. (На самом деле, можно даже помещать ресурсы DrawingBrush или DrawingImage в отдельно скомпилированную сборку DLL)

Чтобы сэкономить ресурсы в Expression Design, потребуется явно выбрать Resource Dictionary (Словарь ресурсов) вместо Canvas (Холст) в списке Document Format (Формат документа).

Другая причина, по которой важно понимать внутреннюю "кухню" двухмерной графики, состоит в том, что ею намного легче манипулировать. Например, изменить стандартную двухмерную графику можно, модифицируя кисти, используемые для рисования различных фигур, применяя трансформации к индивидуальным геометриям, а также изменяя прозрачность всего слоя фигур (через объект DrawingGroup). Еще важнее то, что можно добавлять, удалять либо изменять индивидуальные геометрии. Эти приемы легко комбинировать с анимацией.

Например, очень легко поворачивать объект Geometry, модифицируя свойство Angle объекта RotateTransform, "проявлять" слой фигур, используя DrawingGroup.Opacity, или создавать эффект вращающегося градиента, выполняя анимацию кисти LinearGradientBrush, которая закрашивает GeometryDrawing.

При желании можно исследовать ресурсы, применяемые в других приложениях WPF. Базовый прием заключается в использовании инструмента вроде .NET Reflector (http://www.red-gate.com/products/dotnet-development/reflector/) для нахождения сборки с ресурсами. Затем с помощью подключаемого модуля .NET Reflector можно извлечь один из ресурсов BAML и декомпилировать его обратно в XAML. Стоит заметить, что большинство компаний не особо благосклонно относятся к разработчикам, которые заимствуют их вручную созданную графику для использования в собственных приложениях.

Пройди тесты
Лучший чат для C# программистов