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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 333 334 335 336 337 338 339 340 341 ... 407
Перейти на страницу:
больше кода.

Наконец, если требуется самый быстрый способ визуализации значительных объемов графических данных, то должен быть выбран визуальный уровень. Например, предположим, что инфраструктура WPF применяется для построения научного приложения, которое должно отображать тысячи точек на графике данных. За счет использования визуального уровня точки на графике можно визуализировать оптимальным образом. Как будет показано далее в главе, визуальный уровень доступен только из кода С#, но не из разметки XAML.

Независимо от выбранного подхода (фигуры, рисунки и геометрические объекты или визуальные объекты) всегда будут применяться распространенные графические примитивы, такие как кисти (для заполнения ограниченных областей), перья (для рисования контуров) и объекты трансформаций (которые видоизменяют данные). Исследование начинается с классов из пространства имен System.Windows.Shapes.

На заметку! Инфраструктура WPF поставляется также с полнофункциональным API-интерфейсом, который можно использовать для визуализации и манипулирования трехмерной графикой, но в книге он не рассматривается.

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

Члены пространства имен System.Windows.Shapes предлагают наиболее прямолинейный, интерактивный и самый затратный в плане расхода памяти способ визуализации двумерного изображения. Это небольшое пространство имен (расположенное в сборке PresentationFramework.dll) состоит всего из шести запечатанных классов, которые расширяют абстрактный базовый класс Shape: Ellipse, Rectangle, Line, Polygon, Polyline и Path.

Абстрактный класс Shape унаследован от класса FrameworkElement, который сам унаследован от UIElement. В указанных классах определены члены для работы с изменением размеров, всплывающими подсказками, курсорами мыши и т.п. Благодаря такой цепочке наследования при визуализации графических данных с применением классов, производных от Shape, объекты получаются почти такими же функциональными (с точки зрения взаимодействия с пользователем), как элементы управления WPF.

Скажем, для выяснения, щелкнул ли пользователь на визуализированном изображении, достаточно обработать событие MouseDown. Например, если написать следующую разметку XAML для объекта Rectangle внутри элемента управления Grid начального окна Window:

<Rectangle x:Name="myRect" Height="30" Width="30" Fill="Green" 

MouseDown="myRect_MouseDown"/>

то можно реализовать обработчик события MouseDown, который изменяет цвет фона прямоугольника в результате щелчка на нем:

private void myRect_MouseDown(object sender, MouseButtonEventArgs e)

{

  // Изменить цвет прямоугольника в результате щелчка на нем.

  myRect.Fill = Brushes.Pink;

}

В отличие от других инструментальных наборов, предназначенных для работы с графикой, вам не придется писать громоздкий код инфраструктуры, в котором вручную сопоставляются координаты мыши с геометрическим объектом, выясняется попадание курсора внутрь границ, выполняется визуализация в неотображаемый буфер и т.д. Члены пространства имен System.Windows.Shapes просто реагируют на зарегистрированные вами события подобно типичному элементу управления WPF (Button и т.д.).

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

Помимо функциональности, унаследованной от родительских классов UIElement и FrameworkElement, в классе Shape определено множество собственных членов, наиболее полезные из которых кратко описаны в табл. 26.1.

На заметку! Если вы забудете установить свойства Fill и Stroke, то WPF предоставит "невидимые" кисти, вследствие чего фигура не будет видна на экране!

Добавление прямоугольников, эллипсов и линий на поверхность Canvas

Вы построите приложение WPF, которое способно визуализировать фигуры, с применением XAML и С#, и попутно исследуете процесс проверки попадания. Создайте новый проект приложения WPF по имени RenderingWithShapes и измените заголовок главного окна в MainWindow.xaml на Fun with Shapes!. Модифицируйте первоначальную разметку XAML для элемента Window, заменив Grid панелью DockPanel, которая содержит (пока пустые) элементы Toolbar и Canvas. Обратите внимание, что каждому содержащемуся элементу посредством свойства Name назначается подходящее имя.

<DockPanel LastChildFill="True">

  <ToolBar DockPanel.Dock="Top" Name="mainToolBar" Height="50">

  </ToolBar>

  <Canvas Background="LightBlue" Name="canvasDrawingArea"/>

</DockPanel>

picture

Заполните элемент ToolBar набором объектов RadioButton, каждый из которых содержит объект специфического класса, производного от Shape. Легко заметить, что каждому элементу RadioButton назначается то же самое групповое имя GroupName (чтобы обеспечить взаимное исключение) и также подходящее индивидуальное имя.

<ToolBar DockPanel.Dock="Top" Name="mainToolBar" Height="50">

  <RadioButton Name="circleOption" GroupName="shapeSelection"

               Click="CircleOption_Click">

    <Ellipse Fill="Green" Height="35" Width="35" />

  </RadioButton>

  <RadioButton Name="rectOption" GroupName="shapeSelection"

               Click="RectOption_Click">

    <Rectangle Fill="Red" Height="35" Width="35" RadiusY="10" RadiusX="10" />

  </RadioButton>

  <RadioButton Name="lineOption" GroupName="shapeSelection"

               Click="LineOption_Click">

    <Line Height="35" Width="35" StrokeThickness="10" Stroke="Blue"

      X1="10" Y1="10" Y2="25" X2="25"

      StrokeStartLineCap="Triangle" StrokeEndLineCap="Round" />

  </RadioButton>

</ToolBar>

Как видите, объявление объектов Rectangle, Ellipse и Line в разметке XAML довольно прямолинейно и требует лишь минимальных комментариев. Вспомните, что свойство Fill позволяет указать кисть для рисования внутренностей фигуры. Когда нужна кисть сплошного цвета, можно просто задать жестко закодированную строку известных значений, а соответствующий преобразователь типа сгенерирует корректный объект. Интересная характеристика типа Rectangle связана с тем, что в нем определены свойства RadiusX и RadiusY, позволяющие визуализировать скругленные углы.

Объект Line представлен своими начальной и конечной точками с использованием свойств X1, Х2, Y1 и Y2 (учитывая, что высота и ширина при описании линии имеют мало смысла). Здесь устанавливается несколько дополнительных свойств, которые управляют тем, как визуализируются начальная и конечная точки объекта Line, а также настраивают параметры штриха. На рис. 26.1 показана визуализированная панель инструментов в визуальном конструкторе WPF среды Visual Studio.

С помощью окна Properties (Свойства) среды Visual Studio создайте обработчик события MouseLeftButtonDown для Canvas и обработчик события Click для каждого элемента RadioButton. Цель заключается в том, чтобы в коде C# визуализировать выбранную фигуру (круг, квадрат или линию), когда пользователь щелкает внутри Canvas. Первым делом определите следующее вложенное перечисление (и соответствующую переменную-член) внутри класса, производного от Window:

public partial class MainWindow : Window

{

  private enum SelectedShape

  { Circle, Rectangle, Line }

  private

1 ... 333 334 335 336 337 338 339 340 341 ... 407
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. В коментария нецензурная лексика и оскорбления ЗАПРЕЩЕНЫ! Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?