KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
Перейти на страницу:

      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;

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

   FormattedText text = new FormattedText(

    &quot;Hello Visual Layer!&quot;,

    new System.Globalization.CultureInfo(&quot;en-us&quot;),

    FlowDirection.LeftToRight,

    new Typeface(this.FontFamily, FontStyles.Italic,

      FontWeights.DemiBold, FontStretches.UltraExpanded),

    TextFontSize,

    Brushes.Green,

    null,

    VisualTreeHelper.GetDpi(this).PixelsPerDip);

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

  DrawingVisual drawingVisual = new DrawingVisual();

  using(DrawingContext drawingContext =

    drawingVisual.RenderOpen())

  {

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

    drawingContext.DrawRoundedRectangle(

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

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

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

  }

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

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

  RenderTargetBitmap bmp = new RenderTargetBitmap(

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

  bmp.Render(drawingVisual);

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

  myImage.Source = bmp;

}

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

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

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

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

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

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

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

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

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

Визуализация графических данных в специальном диспетчере компоновки

Хотя применение

DrawingVisual
для рисования на фоне элемента управления WPF представляет интерес, возможно чаще придется строить специальный диспетчер компоновки (
Grid
,
StackPanel
,
Canvas
и т.д.), который внутренне использует визуальный уровень для визуализации своего содержимого. После создания такого специального  диспетчера компоновки его можно подключить к обычному элементу
Window
(а также 
Page
или
UserControl
) и позволить части пользовательского интерфейса использовать высоко оптимизированный агент визуализации, в то время как для визуализации некритичных графических данных будут применяться фигуры  и рисунки.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*