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

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

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

Лабораторная работа №20. Будильник

Задание

Создать приложение для Windows Phone 7, позволяющее устанавливать ежедневные будильники с возможностью выбора мелодии. Приложение должно иметь свой тайл.

Освоение

  • Бужильники
  • тайлы

Описание

Создадим новый проект Silverlight for Windows PhoneWindows Phone Application.

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

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

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

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

В код главной страницы добавим функцию установки тайла:

     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);

            apptile.Update(appTileData);
        }

В конструктор класса добавим:

        SetTile();    

Также в коде должна быть добавлена директива:

        using Microsoft.Phone.Shell;

Создадим в проекте папку Audio. Добавим в нее несколько музыкальных файлов формата, который поддерживается Windows Phone 7. Свойство "Build Action" для этих файлов установим в "Content".

Добавим в проект страницу AddAlarm.xaml. В References добавим пространство имен Microsoft.Phone.Controls.Toolkit. Основное содержимое разметки будет выглядеть следующим образом:

       <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <StackPanel Margin="15,15,0,0">
                <TextBlock Text="Текст:"  FontSize="26" />
                <TextBox Name="txtText" FontSize="26" />

                <TextBlock Text="Мелодия:" FontSize="26" VerticalAlignment="Center" />
                <toolkit:ListPicker Name="lpSound">
                    <toolkit:ListPickerItem Content="After Forever - Living Shields.mp3" />
                    <toolkit:ListPickerItem Content="Ancient Bards - The Birth Of Evil.mp3" />
                </toolkit:ListPicker>

                <TextBlock Text="Время:" FontSize="26" VerticalAlignment="Center" />
                <toolkit:TimePicker Name="ToDoItemTime"/>

                <StackPanel Orientation="Horizontal" Margin="0,20,0,0">
                    <Button Name="btnBack" Content="<-" Width="100" Click="btnBack_Click" />
                    <Button Name="btnSet" Content="Установить" Width="340" Click="btnSet_Click" />
                </StackPanel>
            </StackPanel>
        </Grid>

Элемент управления ListPicker будет содержать названия файлов с мелодиями.

В коде страницы добавим директиву, необходимую для установки напоминаний:

        using Microsoft.Phone.Scheduler;

В класс добавим две константы: базовое имя будильника (будильник должен иметь уникальное имя, которое мы будем создавать на основе базового, например, добавлением номера) и максимальное количество будильников.

        private const string ALARM_BASE_NAME = "alarm";
        private const int MAX_ALARM_COUNT = 3;

Функцию генерации имени рекомендуется написать самостоятельно.

Добавим функции создания будильников:

        private void btnSet_Click(object sender, RoutedEventArgs e)
        {
            //генерируем имя напоминания
            string strName = GenerateAlarmName();

            if (!strName.Equals(""))
            {
                if (!txtText.Text.Trim().Equals(""))
                {
                    DateTime beginTime = (DateTime)ToDoItemTime.Value;

                    CreateAlarm(strName, beginTime);
                }
                else
                {
                    MessageBox.Show("Не все поля заполнены.");
                }
            }
            else
            {
                MessageBox.Show("Нельзя создать больше " + MAX_ALARM_COUNT + " будильников.");
            }
        }

        private void CreateAlarm(string strName, DateTime beginTime)
        {
            Alarm myAlarm = new Alarm(strName);
            myAlarm.Content = txtText.Text;

            string strAudio = "/Audio/" + ((ListPickerItem)lpSound.SelectedItem).Content;
            myAlarm.Sound = new Uri(strAudio, UriKind.Relative);

            myAlarm.RecurrenceType = RecurrenceInterval.Daily;
            myAlarm.BeginTime = beginTime;

            ScheduledActionService.Add(myAlarm);
        }

Перейдем к коду главной страницы. Добавим функцию инициализации списка. Будем получать коллекцию будильников, считать их количество и обновлять тайл (свойству count задавать количество зарегистрированных будильников):

      private void InitList()
        {
            listAlarms.ItemsSource = ScheduledActionService.GetActions<ScheduledNotification>();

            int count = 0;

            foreach (Alarm ri in listAlarms.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();
        }

Напишем разметку страницы с использованием шаблонов (источник данных для списка задается в функции InitList()):

    <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <ListBox Name="listAlarms">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Title}" FontSize="26" 
                            TextWrapping="NoWrap" FontWeight="Bold" />
                            <TextBlock Text="{Binding Content}" FontSize="24" 
                            TextWrapping="Wrap" />
                            <TextBlock Text="{Binding BeginTime}" FontSize="24" 
                            FontStyle="Italic" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>

Добавим две кнопки в меню: добавление нового будильника и удаление.

   <!--Sample code showing usage of ApplicationBar-->
    <phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
            <shell:ApplicationBarIconButton IconUri="/Images/appbar.add.rest.png" 
            Text="добавить" Click="MenuAdd_Click" />
            <shell:ApplicationBarIconButton IconUri="/Images/appbar.delete.rest.png" 
            Text="удалить" Click="MenuRemove_Click" />
        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>

Напишем обработчик нажатия на кнопку удаления:

  private void MenuRemove_Click(object sender, EventArgs e)
        {
            if (-1 != listAlarms.SelectedIndex)
            {
                string strName = ((Alarm)listAlarms.SelectedItem).Name;

                if (null != ScheduledActionService.Find(strName))
                {
                    ScheduledActionService.Remove(strName);

                    InitList();
                }
            }
            else
            {
                MessageBox.Show("Нет выделенных элементов.");
            }
        }
< Лекция 4 || Лекция 5: 12345 || Лекция 6 >