Лабораторный практикум 4
Лабораторная работа №19. Список задач с напоминаниями
Задание
Изменить приложение "Список задач", добавив установку напоминаний. Добавить для приложения двусторонний тайл.
Освоение
- напоминания
- тайлы
Описание
Откроем проект "Список задач". Добавим два изображения размера 173x173 (для тайлов). Назовем их, например, "Front.png" и "Background.png". Установим для данных изображений свойство "Build Action" в "Content".
Примечание: тайлы – это изображения, отображающиеся на главной странице Windows Phone 7. Они могут иметь пояснительные надписи и обратную сторону – другое изображение, которое будет периодически появляться. Для того чтобы добавить тайл приложения на главную страницу, в списке приложений нажмите на ваше приложение и удерживайте. В появившемся контекстном меню выберете "pin to start" Рис. 5.4 :
В код главной страницы добавим функцию установки тайла. В качестве основной картинки установим "Front.png", в качестве обратной – "Background.png".
private void SetTile() { ShellTile apptile = ShellTile.ActiveTiles.First(); StandardTileData appTileData = new StandardTileData(); appTileData.Title = "Список задач"; appTileData.Count = 0; appTileData.BackgroundImage = new Uri("/Front.png", UriKind.RelativeOrAbsolute); appTileData.BackTitle = "Список задач"; appTileData.BackContent = "Обратная сторона"; appTileData.BackBackgroundImage = new Uri("/Background.png", UriKind.RelativeOrAbsolute); apptile.Update(appTileData); }
SetTile();
Также в коде должна быть добавлена директива:
using Microsoft.Phone.Shell;
В код страницы AddItem.xaml добавим директиву, необходимую для установки напоминаний:
using Microsoft.Phone.Scheduler;
В класс добавим две константы: базовое имя напоминания (напоминание должно иметь уникальное имя, которое мы будем создавать на основе базового, например, добавлением номера) и максимальное количество.
private const string REMINDER_BASE_NAME = "reminder"; private const int MAX_REMINDER_COUNT = 3;
Функцию генерации имени рекомендуется написать самостоятельно.
Изменим функцию добавления напоминания:
private void btnSet_Click(object sender, RoutedEventArgs e) { //генерируем имя напоминания string strName = GenerateReminderName(); if (!strName.Equals("")) { if (!txtTitle.Text.Trim().Equals("") && !txtText.Text.Trim().Equals("")) { DateTime date = (DateTime)ToDoItemDate.Value; DateTime time = (DateTime)ToDoItemTime.Value; DateTime beginTime = date + time.TimeOfDay; if (beginTime > DateTime.Now) { CreateReminder(strName, beginTime); NavigationService.GoBack(); } else { MessageBox.Show("Невозможно установить задачу на прошлое."); } } else { MessageBox.Show("Не все поля заполнены."); } } else { MessageBox.Show("Нельзя создать больше " + MAX_REMINDER_COUNT + " задач."); } } private void CreateReminder(string strName, DateTime beginTime) { Reminder myReminder = new Reminder(strName); myReminder.Title = txtTitle.Text; myReminder.Content = txtText.Text; myReminder.RecurrenceType = RecurrenceInterval.None; myReminder.BeginTime = beginTime; myReminder.ExpirationTime = beginTime.AddMinutes(5); myReminder.NavigationUri = new Uri("/MainPage.xaml", UriKind.Relative); ScheduledActionService.Add(myReminder); }
Свойство NavigationUri задает ссылку на страницу приложения, которая должна быть запущена при нажатии на напоминание.
Вернемся к коду главной страницы. Добавим функцию инициализации списка. Будем получать коллекцию напоминаний, считать их количество и обновлять тайл (свойству count задавать количество зарегистрированных напоминаний):
private void InitList() { listToDo.ItemsSource = ScheduledActionService.GetActions<ScheduledNotification>(); int count = 0; foreach (Reminder ri in listToDo.ItemsSource) { count++; } //update tile ShellTile apptile = ShellTile.ActiveTiles.First(); StandardTileData appTileData = new StandardTileData(); appTileData.Count = count; apptile.Update(appTileData); }
Не забудем добавить пространство имен для кода главной страницы Microsoft.Phone.Scheduler.
В связи с новой функциональностью перепишем метод OnNavigatedTo() и обработчик нажатия на кнопку "Удалить":
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); InitList(); } private void MenuRemove_Click(object sender, EventArgs e) { if (-1 != listToDo.SelectedIndex) { string strName = ((Reminder)listToDo.SelectedItem).Name; if (null != ScheduledActionService.Find(strName)) { ScheduledActionService.Remove(strName); InitList(); } } else { MessageBox.Show("Нет выделенных элементов."); } }
Также перепишем разметку страницы с использованием шаблонов (источник данных для списка задается в функции InitList()):
<!--ContentPanel - place additional content here--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <ListBox Name="listToDo"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding Title}" FontSize="26" FontWeight="Bold" /> <TextBlock Text="{Binding Content}" FontSize="24" TextWrapping="Wrap" /> <TextBlock Text="{Binding BeginTime}" FontSize="24" FontStyle="Italic" /> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid>