c# desktop. Занятие 11

15
Темы лекции: WPF. Практическое задание: WPF. Тренер: Игорь Шкулипа, к.т.н. Платформа .Net и язык программирования C#. Занятие 11

Upload: igor-shkulipa

Post on 21-Mar-2017

57 views

Category:

Education


1 download

TRANSCRIPT

Page 1: C# Desktop. Занятие 11

Темы лекции: WPF.

Практическое задание: WPF.

Тренер: Игорь Шкулипа, к.т.н.

Платформа .Net и язык программирования C#.

Занятие 11

Page 2: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 2

Связывание данных с внутренними объектами<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="421.8" Width="278.003">

<Grid HorizontalAlignment="Left" Height="394" VerticalAlignment="Top" Width="268"

Margin="0,0,0,-2">

<TextBox x:Name="HeightBox" HorizontalAlignment="Left" Height="23"

Margin="10,38,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="248"

Text="" TextChanged="HeightBox_TextChanged"/>

<Label x:Name="HeightLabel" Content="Высота" HorizontalAlignment="Left"

Margin="10,10,0,0" VerticalAlignment="Top"/>

<TextBox x:Name="WidthBox" HorizontalAlignment="Left" Height="23"

Margin="10,115,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="248"

Text="" TextChanged="WidthBox_TextChanged" />

<Label x:Name="WidthLabel" Content="Ширина" HorizontalAlignment="Left"

Margin="10,87,0,0" VerticalAlignment="Top"/>

<TextBox x:Name="AreaBox" HorizontalAlignment="Left" Height="23"

Margin="10,197,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="248"

Text=""/>

<Label Content="Площадь" HorizontalAlignment="Left" Margin="10,169,0,0"

VerticalAlignment="Top"/>

<Slider x:Name="FontSizeSlider" HorizontalAlignment="Left" Margin="10,242,0,0"

VerticalAlignment="Top" Width="248" Maximum="50" Minimum="5" SmallChange="1"

TickFrequency="2" TickPlacement="Both"/>

<TextBlock x:Name="TextToChangeSize" HorizontalAlignment="Left" Height="43"

Margin="10,294,0,-16" TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Top"

Width="248"/>

</Grid>

</Window>

Page 3: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 3

Класс «Четырехугольник»

public class Rectangle

{

public Rectangle()

{}

private double width;

private double height;

private double area;

public string Width {

get { return Convert.ToString(width); }

set { width = Convert.ToDouble(value); }

}

public string Height {

get { return Convert.ToString(height); }

set { height = Convert.ToDouble(value); }

}

public string Area {

get {

area = width * height;

return Convert.ToString(area);

}

set {

area = width*height;

}

}

}

Page 4: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 4

Класс «Размер шрифта»

class FontSizeValue

{

private int svalue;

public int Value

{

get

{

return Convert.ToInt32(50 * Math.Sin(svalue));

}

set

{

svalue = value;

}

}

}

Page 5: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 5

Класс «Основное окно»

public partial class MainWindow : Window

{

Rectangle rect;

FontSizeValue fsv;

public MainWindow()

{

rect = new Rectangle();

fsv = new FontSizeValue();

Binding HeightBinding = new Binding();

HeightBinding.Path = new PropertyPath("Height");

HeightBinding.Mode = BindingMode.TwoWay;

HeightBinding.Source = rect;

HeightBinding.UpdateSourceTrigger =

UpdateSourceTrigger.PropertyChanged;

Binding WidthBinding = new Binding();

WidthBinding.Path = new PropertyPath("Width");

WidthBinding.Mode = BindingMode.TwoWay;

WidthBinding.Source = rect;

WidthBinding.UpdateSourceTrigger =

UpdateSourceTrigger.PropertyChanged;

Page 6: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 6

Класс «Основное окно»

Binding AreaBinding = new Binding();

AreaBinding.Path = new PropertyPath("Area");

AreaBinding.Mode = BindingMode.TwoWay;

AreaBinding.Source = rect;

AreaBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

Binding SliderBinding = new Binding();

SliderBinding.Path = new PropertyPath("Value");

SliderBinding.Mode = BindingMode.OneWayToSource;

SliderBinding.Source = fsv;

SliderBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

Binding FontSizeBinding = new Binding();

FontSizeBinding.Path = new PropertyPath("Value");

FontSizeBinding.Mode = BindingMode.OneWay;

FontSizeBinding.Source = fsv;

FontSizeBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

InitializeComponent();

HeightBox.SetBinding(TextBox.TextProperty, HeightBinding);

WidthBox.SetBinding(TextBox.TextProperty, WidthBinding);

AreaBox.SetBinding(TextBox.TextProperty,AreaBinding);

FontSizeSlider.SetBinding(Slider.ValueProperty, SliderBinding);

TextToChangeSize.SetBinding(TextBlock.FontSizeProperty, FontSizeBinding);

}

Page 7: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 7

Обработчики событий изменения текста

private void HeightBox_TextChanged(object sender, TextChangedEventArgs e)

{

if (AreaBox != null) AreaBox.Text = "";

}

private void WidthBox_TextChanged(object sender, TextChangedEventArgs e)

{

if (AreaBox != null) AreaBox.Text = "";

}

Page 8: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 8

Результат

Page 9: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 9

Анимации

В настоящее время в WPF используются три подхода к анимации (линейнаяинтерполяция, ключевые кадры и пути), ничто не мешает создавать классыанимации, которые модифицируют значения на основе совершенно другогоподхода. Единственное требование — класс анимации должен модифицироватьзначения с течением времени. В пространстве именSystem.Windows.Media.Animation описаны несколько классов анимации:

• 17 классов использующих анимацию методом интерполяции;• 22 класса использующих анимацию ключевого кадра;• 3 класса использующих анимацию на основе пути.

Все эти классы анимации унаследованы от абстрактного классаИмяТипаAnimationBase, реализующего несколько основополагающих аспектов.Он предоставляет основу для создания собственных классов анимации. Если типданных поддерживает более одного типа анимации, то все его классы анимациинаследуются от абстрактного базового класса. Например, DoubleAnimation иDoubleAnimationUsingKeyFrames — оба являются наследникамиDoubleAnimationBase.

Этими 42 классами содержимое пространства имен System.Windows.Media.Animationне исчерпывается. Каждая анимация ключевого кадра также работает ссобственным классом ключевого кадра и классом коллекции ключевых кадров.Так что в сумме пространство имен System.Windows.Media.Animation содержитболее 100 классов.

Page 10: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 10

Пример

<Button x:Name="AnimateButton" Content="Animate”

HorizontalAlignment="Left" Margin="10,337,0,0”

VerticalAlignment="Top" Width="248" Height="47"/>

Page 11: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 11

Обработчик

private void AnimateButton_Click(object sender, RoutedEventArgs e)

{

//TextBoxes

ThicknessAnimation ta1 = new ThicknessAnimation();

ta1.From = new Thickness(HeightBox.Margin.Left, HeightBox.Margin.Top,

HeightBox.Margin.Right, HeightBox.Margin.Bottom);

ta1.To = new Thickness(HeightBox.Margin.Left, WidthBox.Margin.Top,

HeightBox.Margin.Right, HeightBox.Margin.Bottom);

ThicknessAnimation ta2 = new ThicknessAnimation();

ta2.From = new Thickness(WidthBox.Margin.Left, WidthBox.Margin.Top,

WidthBox.Margin.Right, WidthBox.Margin.Bottom);

ta2.To = new Thickness(WidthBox.Margin.Left, HeightBox.Margin.Top,

WidthBox.Margin.Right, WidthBox.Margin.Bottom);

//Labels

ThicknessAnimation ta3 = new ThicknessAnimation();

ta3.From = new Thickness(HeightLabel.Margin.Left, HeightLabel.Margin.Top,

HeightLabel.Margin.Right, HeightLabel.Margin.Bottom);

ta3.To = new Thickness(HeightLabel.Margin.Left, WidthLabel.Margin.Top,

HeightLabel.Margin.Right, HeightLabel.Margin.Bottom);

ThicknessAnimation ta4 = new ThicknessAnimation();

ta4.From = new Thickness(WidthLabel.Margin.Left, WidthLabel.Margin.Top,

WidthLabel.Margin.Right, WidthLabel.Margin.Bottom);

ta4.To = new Thickness(WidthLabel.Margin.Left, HeightLabel.Margin.Top,

WidthLabel.Margin.Right, WidthLabel.Margin.Bottom);

HeightBox.BeginAnimation(TextBox.MarginProperty, ta1);

HeightLabel.BeginAnimation(Label.MarginProperty, ta3);

WidthBox.BeginAnimation(TextBox.MarginProperty, ta2);

WidthLabel.BeginAnimation(Label.MarginProperty, ta4);

}

Page 13: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 13

Архитектурный паттерн MVVM

• Модель (Model), так же, как вклассическом паттерне MVC, Модельпредставляет собой фундаментальныеданные, необходимые для работыприложения (классы, структуры).

• Вид/Представление (View) также, как в классическом паттерне MVC,Вид — это графический интерфейс, тоесть окно, кнопки и.т.п.

• Модель вида (ViewModel, чтоозначает «Model of View») является содной стороны абстракцией Вида, а сдругой предоставляет обертку данныхиз Модели, которые подлежатсвязыванию. То есть она содержитМодель, которая преобразована кВиду, а так же содержит в себекоманды, которыми можетпользоваться Вид, чтобы влиять наМодель.

Page 14: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 14

MVVM

Page 15: C# Desktop. Занятие 11

http://www.slideshare.net/IgorShkulipa 15

Лабораторная работа №11. WPF

Создать приложение “Сумасшедший калькулятор”, которое реализует всефункции калькулятора, но после каждого нажатия кнопки, кнопкиперемешиваются в случайном порядке.