Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
Измените код класса CustomVisualFrameworkElement для обработки события MouseDown в конструкторе класса с применением стандартного синтаксиса С#:
this.MouseDown += CustomVisualFrameworkElement_MouseDown;
Реализация данного обработчика будет вызывать метод VisualTreeHelper.HitTest() с целью выяснения, находится ли курсор мыши внутри границ одного из визуальных объектов. Для этого в одном из параметров метода HitTest() указывается делегат HitTestResultCallback, который будет выполнять вычисления. Добавьте в класс CustomVisualFrameworkElement следующие методы:
void CustomVisualFrameworkElement_MouseDown(object sender, MouseButtonEventArgs e)
{
// Выяснить, где пользователь выполнил щелчок.
Point pt = e.GetPosition((UIElement)sender);
// Вызвать вспомогательную функцию через делегат, чтобы
// посмотреть, был ли совершен щелчок на визуальном объекте.
VisualTreeHelper.HitTest(this, null,
new HitTestResultCallback(myCallback), new PointHitTestParameters(pt));
}
public HitTestResultBehavior myCallback(HitTestResult result)
{
// Если щелчок был совершен на визуальном объекте, то
// переключиться между скошенной и нормальной визуализацией.
if (result.VisualHit.GetType() == typeof(DrawingVisual))
{
if (((DrawingVisual)result.VisualHit).Transform == null)
{
((DrawingVisual)result.VisualHit).Transform = new SkewTransform(7, 7);
}
else
{
((DrawingVisual)result.VisualHit).Transform = null;
}
}
// Сообщить методу HitTest() о прекращении углубления в визуальное дерево.
return HitTestResultBehavior.Stop;
}
Снова запустите программу. Теперь должна появиться возможность щелкать на любом из отображенных визуальных объектов и наблюдать за выполнением трансформации. Наряду с тем, что рассмотренный пример взаимодействия с визуальным уровнем WPF очень прост, не забывайте, что здесь можно использовать те же самые кисти, трансформации, перья и диспетчеры компоновки, которые обычно применяются в разметке XAML. Таким образом, вы уже знаете довольно много о работе с классами, производными от Visual.
На этом исследование служб графической визуализации WPF завершено. Несмотря на раскрытие ряда интересных тем, на самом деле мы лишь слегка затронули обширную область графических возможностей инфраструктуры WPF. Дальнейшее изучение фигур, рисунков, кистей, трансформаций и визуальных объектов вы можете продолжить самостоятельно (в оставшихся главах, посвященных WPF, еще встретятся дополнительные детали).
Резюме
Поскольку Windows Presentation Foundation является настолько насыщенной графикой инфраструктурой для построения графических пользовательских интерфейсов, не должно вызывать удивления наличие нескольких способов визуализации графического вывода. Плава начиналась с рассмотрения трех подходов к визуализации (фигуры, рисунки и визуальные объекты ), а также разнообразных примитивов визуализации, таких как кисти, перья и трансформации.
Вспомните, что когда необходимо строить интерактивную двумерную визуализацию, то фигуры делают такой процесс очень простым. С другой стороны, статические, не интерактивные изображения могут визуализироваться в оптимальной манере с использованием рисунков и геометрических объектов, а визуальный уровень (доступный только в коде) обеспечит максимальный контроль и производительность.
Глава 27
Ресурсы, анимация, стили и шаблоны WPF
В настоящей главе будут представлены три важные (и взаимосвязанные) темы, которые позволят углубить понимание API-интерфейса Windows Presentation Foundation (WPF). Первым делом вы изучите роль логических ресурсов. Вы увидите, что система логических ресурсов (также называемых объектными ресурсами) представляет собой способ ссылки на часто используемые объекты внутри приложения WPF. Хотя логические ресурсы нередко реализуются в разметке XAML, они могут быть определены и в процедурном коде.
Далее вы узнаете, как определять, выполнять и управлять анимационной последовательностью. Вопреки тому, что можно было подумать, применение анимации WPF не ограничивается видеоиграми или мультимедийными приложениями. В API-интерфейсе WPF анимация может использоваться, например, для подсветки кнопки, когда она получает фокус, или увеличения размера выбранной строки в DataGrid. Понимание анимации является ключевым аспектом построения специальных шаблонов элементов управления (как вы увидите позже в главе).
Затем объясняется роль стилей и шаблонов WPF. Подобно веб-странице, в которой применяются стили CSS или механизм тем ASP.NET, приложение WPF может определять общий вид и поведение для набора элементов управления. Такие стили можно определять в разметке и сохранять их в виде объектных ресурсов для последующего использования, а также динамически применять во время выполнения. В последнем примере вы научитесь строить специальные шаблоны элементов управления.
Система ресурсов WPF
Первой задачей будет исследование темы встраивания и доступа к ресурсам приложения. Инфраструктура WPF поддерживает два вида ресурсов. Первый из них — двоичные ресурсы; эта категория обычно включает элементы, которые большинство программистов считают ресурсами в традиционном смысле (встроенные файлы изображений или звуковых клипов, значки, используемые приложением, и т.д.).
Вторая категория, называемая объектными ресурсами или логическими ресурсами, представляет именованные объекты .NET, которые можно упаковывать и многократно применять повсюду в приложении. Несмотря на то что упаковывать в виде объектного ресурса разрешено любой объект .NET, логические ресурсы особенно удобны при работе с графическими данными произвольного рода, поскольку можно определить часто используемые графические примитивы (кисти, перья, анимации и т.д.) и ссылаться на них по мере необходимости.
Работа с двоичными ресурсами
Прежде чем перейти к теме объектных ресурсов, давайте кратко проанализируем, как упаковывать двоичные ресурсы вроде значков и файлов изображений (например, логотипов компании либо изображений для анимации) внутри приложений. Создайте в Visual Studio новый проект приложения WPF по имени BinaryResourcesApp. Модифицируйте разметку начального окна для обработки события Loaded элемента Window и применения DockPanel в качестве корня компоновки:
<Window x:Class="BinaryResourcesApp.MainWindow"
<! -- Для краткости разметка не показана -->
Title="Fun with Binary Resources" Height="500" Width="649"
Loaded="MainWindow_OnLoaded">
<DockPanel LastChildFill="True">
</DockPanel>
</Window>
Предположим, что приложение должно отображать внутри части окна один из трех файлов изображений, основываясь на пользовательском вводе. Элемент управления Image из WPF может использоваться для отображения не только типичного файла изображения (*.bmp, *.gif, *.ico, *.jpg, *.png, *.wdp или *.tiff), но также данных объекта DrawingImage (как было показано в главе 26). Можете построить пользовательский интерфейс окна, который поддерживает диспетчер компоновки DockPanel, содержащий простую панель инструментов с кнопками Next (Вперед) и Previous (Назад). Ниже панели инструментов расположите элемент управления Image, свойство Source которого в текущий момент не установлено:
<DockPanel LastChildFill="True">
<ToolBar Height="60" Name="picturePickerToolbar" DockPanel.Dock="Top">
<Button x:Name="btnPreviousImage" Height="40" Width="100" BorderBrush="Black"
Margin="5" Content="Previous" Click="btnPreviousImage_Click"/>
<Button x:Name="btnNextImage" Height="40" Width="100" BorderBrush="Black"
Margin="5" Content="Next" Click="btnNextImage_Click"/>
</ToolBar>