Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

• переопределить два виртуальных метода из класса

FrameworkElement
, позволив контейнеру получать созданные визуальные данные.

Давайте исследуем последние два шага более подробно. Чтобы продемонстрировать применение класса

DrawingVisual
для визуализации двумерных данных, создайте в Visual Studio новый проект приложения WPF по имени
RenderingWithVisuals
. Первой целью будет использование класса
DrawingVisual
для динамического присваивания данных элементу управления
Image
из WPF.
Начните со следующего обновления разметки XAML окна для обработки события
Loaded
:

<Window x:Class="RenderingWithVisuals.MainWindow"

<!--omitted for brevity -->

Title="Fun With Visual Layer" Height="450" Width="800"

Loaded="MainWindow_Loaded">

Замените элемент

Grid
панелью
StackPanel
и добавьте в нее элемент
Image
:

<StackPanel Background="AliceBlue" Name="myStackPanel">

<Image Name="myImage" Height="80"/>

</StackPanel>

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

Image
пока не имеет значения в свойстве
Source
, т.к. оно будет устанавливаться во время выполнения. С событием
Loaded
связана работа по построению графических данных в памяти с применением объекта
DrawingBrush
. Удостоверьтесь в том, что файл
MainWindow.cs
содержит операторы using для следующих пространств имен:

using System;

using System.Windows;

using System.Windows.Media;

using System.Windows.Media.Imaging;

Вот реализация обработчика события

Loaded
:

private void MainWindow_Loaded(

object sender, RoutedEventArgs e)

{

const int TextFontSize = 30;

// Создать объект System.Windows.Media.FormattedText.

FormattedText text = new FormattedText(

"Hello Visual Layer!",

new System.Globalization.CultureInfo("en-us"),

FlowDirection.LeftToRight,

new Typeface(this.FontFamily, FontStyles.Italic,

FontWeights.DemiBold, FontStretches.UltraExpanded),

TextFontSize,

Brushes.Green,

null,

VisualTreeHelper.GetDpi(this).PixelsPerDip);

// Создать объект DrawingVisual и получить объект DrawingContext.

DrawingVisual drawingVisual = new DrawingVisual;

using(DrawingContext drawingContext =

drawingVisual.RenderOpen)

{

//
Вызвать любой из методов DrawingContext для визуализации данных.

drawingContext.DrawRoundedRectangle(

Brushes.Yellow, new Pen(Brushes.Black, 5),

new Rect(5, 5, 450, 100), 20, 20);

drawingContext.DrawText(text, new Point(20, 20));

}

// Динамически создать битовое изображение,

// используя данные в объекте DrawingVisual.

RenderTargetBitmap bmp = new RenderTargetBitmap(

500, 100, 100, 90, PixelFormats.Pbgra32);

bmp.Render(drawingVisual);

// Установить источник для элемента управления Image.

myImage.Source = bmp;

}

В коде задействовано несколько новых классов WPF, которые будут кратко описаны ниже. Метод начинается с создания нового объекта

FormattedText
, который представляет текстовую часть конструируемого изображения в памяти. Как видите, конструктор позволяет указывать многочисленные атрибуты, в том числе размер шрифта, семейство шрифтов, цвет переднего плана и сам текст.

Затем через вызов метода

RenderOpen
на экземпляре
DrawingVisual
получается необходимый объект
DrawingContext
. Здесь в
DrawingVisual
визуализируется цветной прямоугольник со скругленными углами, за которым следует форматированный текст. В обоих случаях графические данные помещаются в
DrawingVisual
с применением жестко закодированных значений, что не слишком хорошо в производственном приложении, но вполне подходит для такого простого теста.

Несколько последних операторов отображают

DrawingVisual
на объект
RenderTagetBitmap
, который является членом пространства имен
System.Windows.Media.Imaging
. Этот класс принимает визуальный объект и трансформирует его в растровое изображение, находящееся в памяти. Затем устанавливается свойство
Source
элемента управления
Image
и получается вывод, показанный на рис. 26.14.

На заметку! Пространство имен

System.Windows.Media.Imaging
содержит дополнительные классы кодирования, которые позволяют сохранять находящийся в памяти объект
RenderTargetBitmap
в физический файл в разнообразных форматах. Детали ищите в описании
JpegBitmapEncoder
и связанных с ним классов.

Поделиться:
Популярные книги

Менталист. Эмансипация

Еслер Андрей
1. Выиграть у времени
Фантастика:
альтернативная история
7.52
рейтинг книги
Менталист. Эмансипация

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Виконт. Книга 1. Второе рождение

Юллем Евгений
1. Псевдоним `Испанец`
Фантастика:
фэнтези
боевая фантастика
попаданцы
6.67
рейтинг книги
Виконт. Книга 1. Второе рождение

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Месть Паладина

Юллем Евгений
5. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Месть Паладина

Новый Рал

Северный Лис
1. Рал!
Фантастика:
фэнтези
попаданцы
5.70
рейтинг книги
Новый Рал

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Прометей: владыка моря

Рави Ивар
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Прометей: владыка моря

Тринадцатый

NikL
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
6.80
рейтинг книги
Тринадцатый

Мастер темных Арканов

Карелин Сергей Витальевич
1. Мастер темных арканов
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Мастер темных Арканов

Дайте поспать! Том II

Матисов Павел
2. Вечный Сон
Фантастика:
фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Дайте поспать! Том II

Возрождение Феникса. Том 1

Володин Григорий Григорьевич
1. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.79
рейтинг книги
Возрождение Феникса. Том 1

Его темная целительница

Крааш Кира
2. Любовь среди туманов
Фантастика:
фэнтези
5.75
рейтинг книги
Его темная целительница