Трансформация и анимация в Silverlight с помощью XAML
Дополнительные материалы к занятию можно скачать
здесь.
WPF предоставляет дополнительные графические и анимационные возможности, которые были ранее доступны только из специализированных библиотек - в частности, Интерфейс графических устройств (GDI) Microsoft Windows и Microsoft Windows GDI+. WPF предлагает встроенную поддержку мультимедиа, векторной графики, анимации и композиции содержимого, упрощая разработчикам создание оригинального пользовательского интерфейса и содержимого. Используя Microsoft Visual Studio .NET или даже текстовый редактор, такой как Блокнот (Майкрософт), можно создать векторную графику или сложную анимацию и интегрировать мультимедиа в приложения.
Новые графические и мультимедийные возможности в WPF
WPF знакомит разработчиков Windows с новыми графическими функциями, которые имеют следующие преимущества:
- Разрешение и аппаратно-независимая графика. Графическая система WPF использует аппаратно-независимые модули для поддержки разрешения и независимости от устройства. Каждый независимая от устройства точка автоматически масштабируется в соответствии с параметрами системы (в точках на дюйм).
- Повышенная точность. Система координат WPF использует doubles вместо floats. WPF также поддерживает широкую цветовую гамму (scRGB) и предоставляет встроенную поддержку для управления входными данными из другого цветового пространства.
- Дополнительная поддержка графики и анимации. WPF упрощает программирование графики с помощью управления графом сцены; больше не нужно беспокоиться об обработке сцены, циклах отрисовки и билинейной интерполяции. WPF предоставляет поддержку проверки нажатия, встроенную систему анимации и полную поддержку альфа-компоновки.
- Аппаратное ускорение. Графическая система WPF разработана для использования преимуществ графического оборудования и минимизировать загрузку процессора.
Упражнение 12.1. Рисуем треугольник
Создаем проект practice_5_1.
В окне MainPage.xaml наберите следующий код:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="LayoutRoot">
<Viewport3D Height="300" Width="300" >
<Viewport3D.Camera>
<PerspectiveCamera Position="4 0.5 0.5" LookDirection="-3.5 0 0" />
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Direction="-3.5 0 0" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="1 0 0 1 1 0 1 0 1 "
TriangleIndices="0 1 2"/>
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="BlueViolet" />
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
</Grid>
</Window>
Перейдите в окно MainPage.xaml.cs и документрируем строчку InitializeComponent();:
Получаем следующий результат:
Упражнение 12.2. Рисуем треугольник в коде (Чарльз Петзольд)
Для начала нужно создать пустой проект C#:
В свойствах проекта в пункте "Тип выходных данных" выберите "Приложение Windows".
Добавьте к проекту элемент "Файл с текстом программы".
К ссылкам проекта добавьте PresentationCore, PresentationFramework, System, System.Xaml и WindowsBase:
В окно кода добавьте следующую программу:
// Simple3DSceneInCode.cs (c) 2007 by Charles Petzold
//----------------------------------------------------
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using System.Windows.Media.Media3D;
namespace Petzold.Simple3DSceneInCode
{
public class Simple3DSceneInCode : Window
{
PerspectiveCamera cam;
[STAThread]
public static void Main()
{
Application app = new Application();
app.Run(new Simple3DSceneInCode());
}
public Simple3DSceneInCode()
{
Title = "Simple 3D Scene in Code";
// Создаем контент док-панели окна
DockPanel dock = new DockPanel();
Content = dock;
// Создаем скролл-бар для движения камеры
ScrollBar scroll = new ScrollBar();
scroll.Orientation = Orientation.Horizontal;
scroll.Value = -2;
scroll.Minimum = -2;
scroll.Maximum = 2;
scroll.ValueChanged += ScrollBarOnValueChanged;
dock.Children.Add(scroll);
DockPanel.SetDock(scroll, Dock.Bottom);
// Создаем Viewport3D для трехмерной сцена
Viewport3D viewport = new Viewport3D();
dock.Children.Add(viewport);
// Задаем MeshGeometry3D.
MeshGeometry3D mesh = new MeshGeometry3D();
mesh.Positions.Add(new Point3D(0, 0, 0));
mesh.Positions.Add(new Point3D(0, 1, -1));
mesh.Positions.Add(new Point3D(0, 0, -2));
mesh.TriangleIndices = new Int32Collection(new int[] { 0, 1, 2 });
// Задаем GeometryModel3D.
GeometryModel3D geomod = new GeometryModel3D();
geomod.Geometry = mesh;
geomod.Material = new DiffuseMaterial(Brushes.Blue);
geomod.BackMaterial = new DiffuseMaterial(Brushes.Red);
// Создаем ModelVisual3D для GeometryModel3D.
ModelVisual3D modvis = new ModelVisual3D();
modvis.Content = geomod;
viewport.Children.Add(modvis);
// Создаем другую ModelVisual3D для света
modvis = new ModelVisual3D();
modvis.Content = new AmbientLight(Colors.White);
viewport.Children.Add(modvis);
// Создаем камеру
cam = new PerspectiveCamera(new Point3D(-2, 0, 5),
new Vector3D(0, 0, -1), new Vector3D(0, 1, 0), 45);
viewport.Camera = cam;
}
void ScrollBarOnValueChanged(object sender,
RoutedPropertyChangedEventArgs<double> args)
{
cam.Position = new Point3D(args.NewValue, 0, 5);
}
}
}
Листинг
.
Получаем следующий результат:
Упражнение 12.3. Рисование двух треугольников
Создаем проект practice_5_3.
В окне MainPage.xaml наберите следующий код:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="Два треугольника образуют квадрат"
Title="Два треугольника">
<Viewport3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="0 1 0, 0 0 0, 1 1 0, 1 0 0"
TriangleIndices="0 1 2, 1 3 2" />
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Blue" />
</GeometryModel3D.Material>
<GeometryModel3D.BackMaterial>
<DiffuseMaterial Brush="Red" />
</GeometryModel3D.BackMaterial>
</GeometryModel3D>
<!-- Источники света -->
<AmbientLight Color="#404040" />
<DirectionalLight Color="#C0C0C0" Direction="0 0 -3.5" />
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
<!-- Камера -->
<Viewport3D.Camera>
<PerspectiveCamera Position="0.5 0.5 4"
LookDirection="0 0 -3.5"
UpDirection="1 0 0"
FieldOfView="60" />
</Viewport3D.Camera>
</Viewport3D>
</Page>
Листинг
.
Перейдите в окно MainPage.xaml.cs и документрируем строчку InitializeComponent();:
Получаем следующий результат:






