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

на главную

Жанры

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

<!-- Элемент Ellipse, масштабированный на 20% -->

<Ellipse Fill ="Blue" Width="5" Height="5">

<Ellipse.LayoutTransform>

<ScaleTransform ScaleX ="20" ScaleY ="20"/>

</Ellipse.LayoutTransform>

</Ellipse>

<!-- Элемент TextBox, повернутый и скошенный -->

<TextBox Text ="Me Too!" Width="50" Height="40">

<TextBox.LayoutTransform>

<TransformGroup>

<RotateTransform Angle ="45"/>

<SkewTransform AngleX ="5" AngleY ="20"/>

</TransformGroup>

</TextBox.LayoutTransform>

</TextBox>

Следует

отметить, что в случае применения трансформации выполнять какие-либо ручные вычисления для реагирования на проверку попадания, перемещение фокуса ввода и аналогичные действия не придется. Графический механизм WPF самостоятельно решает такие задачи. Например, на рис. 26.8 можно видеть, что элемент
TextBox
по-прежнему реагирует на клавиатурный ввод.

Трансформация данных Canvas

Теперь нужно внедрить в пример

RenderingWithShapes
логику трансформации. Помимо применения объектов трансформации к одиночному элементу (
Rectangle
,
TextBox
и т.д.) их можно также применять к диспетчеру компоновки, чтобы трансформировать все внутренние данные. Например, всю панель
DockPanel
главного окна можно было бы визуализировать под углом:

<DockPanel LastChildFill="True">

<DockPanel.LayoutTransform>

<RotateTransform Angle="45"/>

</DockPanel.LayoutTransform>

...

</DockPanel>

В рассматриваемом примере это несколько чрезмерно, так что добавьте последнюю (менее радикальную) возможность, которая позволит пользователю зеркально отобразить целый контейнер

Canvas
и всю содержащуюся в нем графику. Начните с добавления в
ToolBar
финального элемента
ToggleButton
со следующим определением:

<ToggleButton Name="flipCanvas" Click="FlipCanvas_Click"

Content="Flip Canvas!"/>

Внутри обработчика события

Click
для нового элемента
ToggleButton
создайте объект
RotateTransform
и подключите его к объекту
Canvas
через свойство
LayoutTransform
, если элемент
ToggleButton
отмечен. Если же элемент
ToggleButton
не отмечен, тогда удалите трансформацию, установив свойство
LayoutTransform
в
null
.

private void FlipCanvas_Click(object sender, RoutedEventArgs e)

{

if (flipCanvas.IsChecked == true)

{

RotateTransform rotate = new RotateTransform(-180);

canvasDrawingArea.LayoutTransform = rotate;

}

else

{

canvasDrawingArea.LayoutTransform = null;

}

}

Запустите

приложение и добавьте несколько графических фигур в область
Canvas
, следя за тем, чтобы они находились впритык к ее краям. После щелчка на новой кнопке обнаружится, что фигуры выходят за границы
Canvas
(рис. 26.9). Причина в том, что не был определен прямоугольник отсечения.

Исправить проблему легко. Вместо того чтобы вручную писать сложную логику отсечения, просто установите свойство

ClipToBounds
элемента
Canvas
в
true
, предотвратив визуализацию дочерних элементов вне границ родительского элемента. После запуска приложения можно заметить, что графические данные больше не покидают границы отведенной области.

<Canvas ClipToBounds = "True" ... >

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

Чтобы устранить проблему, примените тот же самый объект трансформации к рисуемой фигуре перед выполнением визуализации (через

RenderTransform
). Ниже показан основной фрагмент кода:

private void CanvasDrawingArea_MouseLeftButtonDown(object sender,

MouseButtonEventArgs e)

{

// Для краткости код не показан.

if (flipCanvas.IsChecked == true)

{

RotateTransform rotate = new RotateTransform(-180);

shapeToRender.RenderTransform = rotate;

}

// Установить левую верхнюю точку для рисования на холсте.

Canvas.SetLeft(shapeToRender, e.GetPosition(canvasDrawingArea).X);

Canvas.SetTop(shapeToRender, e.GetPosition(canvasDrawingArea).Y);

// Нарисовать фигуру.

canvasDrawingArea.Children.Add(shapeToRender);

}

На этом исследование пространства имен

System.Windows.Shapes
, кистей и трансформаций завершено. Прежде чем перейти к анализу роли визуализации графики с использованием рисунков и геометрических объектов, имеет смысл выяснить, каким образом IDE-среда Visual Studio способна упростить работу с примитивными графическими элементами.

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

Законы Рода. Том 5

Flow Ascold
5. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 5

Идеальный мир для Социопата 4

Сапфир Олег
4. Социопат
Фантастика:
боевая фантастика
6.82
рейтинг книги
Идеальный мир для Социопата 4

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Идущий в тени. Книга 2

Амврелий Марк
2. Идущий в тени
Фантастика:
фэнтези
6.93
рейтинг книги
Идущий в тени. Книга 2

Мне нужна жена

Юнина Наталья
Любовные романы:
современные любовные романы
6.88
рейтинг книги
Мне нужна жена

Я же бать, или Как найти мать

Юнина Наталья
Любовные романы:
современные любовные романы
6.44
рейтинг книги
Я же бать, или Как найти мать

Ратник

Ланцов Михаил Алексеевич
3. Помещик
Фантастика:
альтернативная история
7.11
рейтинг книги
Ратник

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Столичный доктор. Том III

Вязовский Алексей
3. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том III

Ты не мой BOY

Рам Янка
5. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты не мой BOY

Маршал Советского Союза. Трилогия

Ланцов Михаил Алексеевич
Маршал Советского Союза
Фантастика:
альтернативная история
8.37
рейтинг книги
Маршал Советского Союза. Трилогия

Авиатор: назад в СССР 12

Дорин Михаил
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 12

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу