Опубликован: 11.01.2013 | Доступ: свободный | Студентов: 623 / 124 | Длительность: 12:06:00
Лекция 5:

Лабораторный практикум 4

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >

Лабораторная работа №19. Список задач с напоминаниями

Задание

Изменить приложение "Список задач", добавив установку напоминаний. Добавить для приложения двусторонний тайл.

Освоение

  • напоминания
  • тайлы

Описание

Откроем проект "Список задач". Добавим два изображения размера 173x173 (для тайлов). Назовем их, например, "Front.png" и "Background.png". Установим для данных изображений свойство "Build Action" в "Content".

Примечание: тайлы – это изображения, отображающиеся на главной странице Windows Phone 7. Они могут иметь пояснительные надписи и обратную сторону – другое изображение, которое будет периодически появляться. Для того чтобы добавить тайл приложения на главную страницу, в списке приложений нажмите на ваше приложение и удерживайте. В появившемся контекстном меню выберете "pin to start" Рис. 5.4 :

Отображение тайла приложения на главной странице

Рис. 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>
  
< Лекция 4 || Лекция 5: 12345 || Лекция 6 >