| Россия, г. Санкт-Петербург |
Лабораторный практикум 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>
