Россия, г. Санкт-Петербург |
Лабораторный практикум 4
Лабораторная работа №20. Будильник
Задание
Создать приложение для Windows Phone 7, позволяющее устанавливать ежедневные будильники с возможностью выбора мелодии. Приложение должно иметь свой тайл.
Освоение
- Бужильники
- тайлы
Описание
Создадим новый проект Silverlight for Windows Phone – Windows Phone Application.
Добавим изображение размера 173x173 (для тайла). Назовем его, например, "Front.png". Установим для данных изображений свойство "Build Action" в "Content".
Примечание: тайлы – это изображения, отображающиеся на главной странице Windows Phone 7. Они могут иметь пояснительные надписи и обратную сторону – другое изображение, которое будет периодически появляться. Для того чтобы добавить тайл приложения на главную страницу, в списке приложений нажмите на ваше приложение и удерживайте. В появившемся контекстном меню выберете "pin to start" Рис. 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("Нет выделенных элементов."); } }