Лекция 4
Раздел 4.1
Windows Phone Темы раздела 3
Windows Phone Элементы Silverlight 4
Windows Phone Элементы Silverlight как объекты 5
Windows Phone Свойства элемента TextBlock 6 resultTextBlock.Text = result.ToString();
Windows Phone Использование метода TryParse 7 float v1 = 0; if (!int.TryParse(firstNumberTextBox.Text, out v1)) { // Код для обработки введённого недопустимого значения }
Windows Phone Изменение цвета текста 8 float v1 = 0; if (!float.TryParse(firstNumberTextBox.Text, out v1)) { firstNumberTextBox.Foreground = new SolidColorBrush(Colors.Red); return; }
Windows Phone Изменение цвета текста 9 float v1 = 0; if (!float.TryParse(firstNumberTextBox.Text, out v1)) { firstNumberTextBox.Foreground = new SolidColorBrush(Colors.Red); return; }
Windows Phone Настройка кисти 10 private SolidColorBrush errorBrush = new SolidColorBrush(Colors.Red); private Brush correctBrush = null;
Windows Phone Сохранение кисти по умолчанию 11 private void calculateResult() { bool errorFound = false; if (correctBrush == null) correctBrush = firstNumberTextBox.Foreground; // остальной код метода }
Windows Phone Использование кистей 12 private void calculateResult() { // настройка кистей if (!float.TryParse(firstNumberTextBox.Text, out v1)) { firstNumberTextBox.Foreground = errorBrush; errorFound = true; } else { firstNumberTextBox.Foreground = correctBrush; } }
Windows Phone Изменение XAML-кода элемента 13
Windows Phone XAML-код элемента TextBlock 14
Windows Phone Свойство InputScope 15
Windows Phone Описание свойства InputScope 16
Windows Phone Атрибуты и элементы 17 72
Windows Phone Настройка свойств в коде на C# 18 // Создание нового элемента InputScope InputScope digitScope = new InputScope(); // Создание нового элемента InputScopeName InputScopeName digits = new InputScopeName(); // Установка свойства name в значение Digits digits.NameValue = InputScopeNameValue.Digits; // Добавление элемента InputScopeName в элемент InputScope digitScope.Names.Add(digits); // Присвоить элементу TextBox созданное свойство firstNumberTextBox.InputScope = digitScope;
Windows Phone Вывод окна с сообщением 19
Windows Phone Пример простого сообщения 20 MessageBox.Show("Недопустимый ввод" + System.Environment.NewLine + "Пожалуйста, повторите ввод");
Windows Phone Сообщение с выбором 21 if (MessageBox.Show( "Вы действительно хотите это сделать?", "Выполнение действия", MessageBoxButton.OKCancel) == MessageBoxResult.OK) { // Действия, если пользователь // нажмёт "ok" } else { // Действия, если пользователь нажмёт "отмена" }
Windows Phone Использование ресурсов 22
Windows Phone Добавление ресурса 23
Windows Phone Ссылка на ресурс 24
Windows Phone Действие при построении 25
Windows Phone Использование файла ресурса 26
Windows Phone Использование внедрённого в сборку изображения 27
Windows Phone Выбор способа размещения ресурсов 28
Windows Phone Краткие итоги 29
Раздел 4.2
Windows Phone Темы раздела 31
Windows Phone События элементов Silverlight 32 private void equalsButton_Click( object sender, RoutedEventArgs e) { calculateResult(); }
Windows Phone Событие TextChanged 33
Windows Phone Автоматическое вычисление результата 34 private void firstNumberTextBox_TextChanged( object sender,TextChangedEventArgs e) { if (firstNumberTextBox.Text == oldFirstNumber) return; oldFirstNumber = firstNumberTextBox.Text; calculateResult(); }
Windows Phone Привязка данных 35
Windows Phone Однонаправленная привязка 36
Windows Phone Двунаправленная привязка 37
Windows Phone Создание класса для привязки 38
Windows Phone Создания объекта для привязки 39 public class AdderClass { private int topValue; public int TopValue { get { return topValue; } set { topValue = value; } } // то же самое для свойства BottomValue public int AnswerValue { get { return topValue + bottomValue;} } }
Windows Phone Добавление уведомления 40 public interface INotifyPropertyChanged { // Событие происходит при изменении значений свойства event PropertyChangedEventHandler PropertyChanged; }
Windows Phone Визуальные элементы Silverlight 41 PropertyChanged(this, new PropertyChangedEventArgs("AnswerValue"));
Windows Phone Определение значения свойства 42 public int AnswerValue { get { return topValue + bottomValue; } }
Windows Phone Связывание класса в XAML-коде 43 xmlns:local="clr-namespace:AddingMachine"
Windows Phone Связывание с классом-ресурсом 44
Windows Phone Добавление ресурса к элементу 45
Windows Phone Применение привязки данных 46
Windows Phone Привязка данных в XAML-коде 47
Windows Phone Установка свойства DataContext 48 // Конструктор public MainPage() { InitializeComponent(); AdderClass adder = new AdderClass(); ContentGrid.DataContext = adder; }
Windows Phone Краткие итоги 49
Раздел 4.3
Windows Phone Краткие итоги 51
Windows Phone Ориентация в Windows Phone 52
Windows Phone Выбор ориентации приложения 53 SupportedOrientations="Portrait" Orientation="Portrait"
Windows Phone Режим нескольких ориентаций 54 SupportedOrientations="PortraitOrLandscape Orientation="Portrait"
Windows Phone Расположение элементов 55
Windows Phone Событие OrientationChanged 56
Windows Phone Поддержка смены ориентации 57 private void PhoneApplicationPage_OrientationChanged( object sender, OrientationChangedEventArgs e) { if (e.Orientation == PageOrientation.PortraitUp) { setPortrait(); } else { setLandscape(); } }
Windows Phone Метод setLandscape 58 private void setLandscape() { firstNumberTextBox.Margin = new Thickness(8,19,0,0); firstNumberTextBox.Width = 207; secondNumberTextBox.Margin = new Thickness(252,19,0,0); secondNumberTextBox.Width = 207; plusTextBlock.Margin = new Thickness(221,35,0,0); resultTextBlock.Margin = new Thickness(538,35,0,0); }
Windows Phone Использование контейнеров 59
Windows Phone Элемент-контейнер StackPanel 60
Windows Phone Использование StackPanel 61
Windows Phone Краткие итоги 62
Раздел 4.4
Windows Phone Темы раздела 64
Windows Phone Списки данных в приложениях 65
Windows Phone Класс Customer 66 public class Customer { public string Name { get; set; } public string Address { get; set; } public int ID { get; set; } public Customer(string inName, string inAddress, int inID) { Name = inName; Address = inAddress; ID = inID; }
Windows Phone Класс Customers 67 public class Customers { public string Name { get; set; } public Customers(string inName) { Name = inName; CustomerList = new List (); } public List CustomerList; }
Windows Phone Подготовка тестовых данных 68 public static Customers MakeTestCustomers() { int id = 0; foreach (string lastName in lastsNames) { foreach (string firstname in firstNames) { // формирование имени клиента string name = firstname + " " + lastName; // добавление клиента в список result.CustomerList.Add(new Customer(name, name + "'s House", id)); id++; } return result; } customers = Customers.MakeTestCustomers();
Windows Phone Элемент StackPanel 69
Windows Phone Тестовые данные 70 foreach (Customer c in customers.CustomerList) { TextBlock customerBlock = new TextBlock(); customerBlock.Text = c.Name; customersStackPanel.Children.Add(customerBlock); }
Windows Phone Отображение списка на экране 71
Windows Phone Элемент ScrollViewer 72
Windows Phone Элемент ListBox 73
Windows Phone Создание шаблона данных 74
Windows Phone Использование шаблона данных 75
Windows Phone Указание источника данных 76 customers = Customers.MakeTestCustomers(); customerList.ItemSource = customers.CustomerList;
Windows Phone Вывод списка в элементе ListBox 77
Windows Phone Улучшенный шаблон данных 78
Windows Phone Вывод списка с новым шаблоном 79
Windows Phone Выбор элементов в ListBox 80
Windows Phone Событие SelectionChanged 81
Windows Phone Событие SelectionChanged 82 private void customerList_SelectionChanged(object sender, SelectionChangedEventArgs e) { // получение содержимого выбранного элемента Customer selectedCustomer = customerList.SelectedItem as Customer; MessageBox.Show("Выбран элемент " + selectedCustomer.Name); }
Windows Phone Краткие итоги 83
Раздел 4.5
Windows Phone Темы раздела 85
Windows Phone Добавление новой страницы 86
Windows Phone Навигация по страницам 87 private void page2Button_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate( new Uri("/CustomerDetailPage.xaml", UriKind.RelativeOrAbsolute)); }
Windows Phone Типы URI 88 private void page2Button_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate( new Uri("/CustomerDetailPage.xaml", UriKind.RelativeOrAbsolute)); }
Windows Phone Использование кнопки Назад 89
Windows Phone Изменение поведения кнопки 90
Windows Phone Отмена перехода 91 private void PhoneApplicationPage_BackKeyPress( object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = true; }
Windows Phone Использование MessageBox 92 private void PhoneApplicationPage_BackKeyPress( object sender, System.ComponentModel.CancelEventArgs e) { if (MessageBox.Show( "Вы действительно хотите перейти на другую страницу?", "Подтверждение перехода", MessageBoxButton.OKCancel) != MessageBoxResult.OK) { e.Cancel = true; } }
Windows Phone Передача данных между страницами 93
Windows Phone Добавление данных в URI 94 // получение информации о выбранном клиенте Customer selectedCustomer = customerList.SelectedItem as Customer; // формирование строки адреса с информацией о клиенте NavigationService.Navigate( new Uri("/CustomerDetailPage.xaml?" + "name=" + selectedCustomer.Name + "&" + "address=" + selectedCustomer.Address, UriKind.Relative));
Windows Phone Использование событий при навигации по страницам 95
Windows Phone Получение данных из URI 96 protected override void OnNavigatedTo (System.Windows.Navigation.NavigationEventArgs e) { string name, address; if (NavigationContext.QueryString.TryGetValue("name", out name)) nameTextBlock.Text = name; }
Windows Phone Совместное использование объектов несколькими страницами 97
Windows Phone Страница App.xaml 98
Windows Phone Класс App 99 public partial class App : Application { // объект используется другими страницами приложения public Customer ActiveCustomer; }
Windows Phone Получение ссылки на объект App 100 protected override void OnNavigatedTo( System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); // получение ссылки на страницу с информацией // о текущем клиенте App thisApp = Application.Current as App; // установка контекста данных для отображения // в элементе Grid customerDisplayGrid.DataContext = thisApp.ActiveCustomer; }
Windows Phone Установка контекста данных 101 protected override void OnNavigatedTo( System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); // получение ссылки на страницу с информацией // о текущем клиенте App thisApp = Application.Current as App; // установка контекста данных для отображения // в элементе Grid customerDisplayGrid.DataContext = thisApp.ActiveCustomer; }
Windows Phone Краткие итоги 102
Раздел 4.6
Windows Phone Темы раздела 104
Windows Phone Отображение изменений 105
Windows Phone Связывание с данными 106
Windows Phone Model-View-ViewModel 107
Windows Phone Класс CustomerView 108 public class CustomerView : INotifyPropertyChanged { private string name; public string Name { get { return name; } set { name = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("name")); } } }... }
Windows Phone Класс CustomerView 109
Windows Phone Методы Load и Save 110 public class CustomerView : INotifyPropertyChanged {... public void Load(Customer cust) { Name = cust.Name; Address = cust.Address; id = cust.ID; } public void Save(Customer cust) { cust.Name = Name; cust.Address = Address; } }
Windows Phone Начало редактирования 111 protected override void OnNavigatedTo( System.Windows.Navigation.NavigationEventArgs e) { // получить ссылку на страницу, содержащую информацию // об активном клиенте App thisApp = Application.Current as App; // загрузить объект с информацией об активном клиенте // в класс ViewModel view.Load(thisApp.ActiveCustomer); // установить контекст данных для отображения customerDisplayGrid.DataContext = view; }
Windows Phone Окончание редактирования 112 private void saveButton_Click(object sender, RoutedEventArgs e) { // получить ссылку на страницу, содержащую информацию // об активном клиенте App thisApp = Application.Current as App; // скопировать данные из класса ViewModel в свойство // ActiveCustomer view.Save(thisApp.ActiveCustomer); // вернуться на предыдущую страницу NavigationService.GoBack(); }
Windows Phone Метод GoBack 113 private void saveButton_Click(object sender, RoutedEventArgs e) {... // вернуться на предыдущую страницу NavigationService.GoBack(); }
Windows Phone Наблюдаемые коллекции 114
Windows Phone Класс ObservableCollection 115 ObservableCollection observableCustomers; observableCustomers = new ObservableCollection (thisApp.ActiveCustomerList.CustomerList); // отображение элементов наблюдаемой коллекции customerList.ItemsSource = observableCustomers;
Windows Phone Подтверждение изменений 116 // найти нужного клиента в списке int pos = observableCustomers.IndexOf( thisApp.ActiveCustomer); // удалить клиента observableCustomers.RemoveAt(pos); // вернуть клиента назад observableCustomers.Insert(pos, thisApp.ActiveCustomer);
Windows Phone Сохранение данных 117 thisApp.ActiveCustomerList.CustomerList = observableCustomers.ToList ();
Windows Phone Краткие итоги 118