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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 530 531 532 533 534 535 536 537 538 ... 642

      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>

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

<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.

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

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

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

1 ... 530 531 532 533 534 535 536 537 538 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий