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

на главную

Жанры

Язык программирования 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 способна упростить работу с примитивными графическими элементами.

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

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Измена. Вторая жена мужа

Караева Алсу
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Вторая жена мужа

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Пенсия для морского дьявола

Чиркунов Игорь
1. Первый в касте бездны
Фантастика:
попаданцы
5.29
рейтинг книги
Пенсия для морского дьявола

На изломе чувств

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

Тринадцатый II

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

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

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

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

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец

Огненный князь 4

Машуков Тимур
4. Багряный восход
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 4

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор