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

на главную - закладки

Жанры

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

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

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Экономка тайного советника

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Экономка тайного советника

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Бестужев. Служба Государевой Безопасности. Книга вторая

Измайлов Сергей
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая

Метатель. Книга 3

Тарасов Ник
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 3

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Ты не мой BOY

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

Идеальный мир для Лекаря 2

Сапфир Олег
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 2

Лекарь для захватчика

Романова Елена
Фантастика:
попаданцы
историческое фэнтези
фэнтези
5.00
рейтинг книги
Лекарь для захватчика

Отверженный VI: Эльфийский Петербург

Опсокополос Алексис
6. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VI: Эльфийский Петербург

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Темный Лекарь 11

Токсик Саша
11. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Темный Лекарь 11