| Россия, г. Санкт-Петербург |
Лабораторный практикум 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("Нет выделенных элементов.");
}
}
