Рассмотрим в этой статье создание простого приложения часов для Windows Phone 7.
Разработка будет производится с помощью SDK for Windows Phone 7.1. Итак, вначале выберем создание нового проекта в VS2010 со следующими конфигурациями:
Чтобы не «удлинять» статью, всё нам ненужное, что было создано автогенерацией, мы оставим. В реальном приложение это убрать не составит проблем.
Теперь на главной странице (MainPage.xaml) расположим новый TextBlock, его имя по умолчанию будет «textBlock1»:
Далее у нас будет идти работа с кодом MainPage.xaml.cs. Сейчас у нас есть всего лишь несколько строк кода:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
namespace MyClock
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
}
// Далее ненужный нам код кнопки
private void Button_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/GamePage.xaml", UriKind.Relative));
}
}
}
В случае обычного приложения для Windows код для часов выглядел бы следующим образом:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Threading;
namespace MyClock
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
textBlock1.Text = DateTime.Now.ToLongTimeString();
(new Thread(UpdateClock)).Start();
}
delegate void MyDelegate();
private void UpdateClock()
{
while (true)
{
Dispatcher.BeginInvoke(new MyDelegate(SetNowTime), null);
Thread.Sleep(500);
}
}
private void SetNowTime()
{
textBlock1.Text = DateTime.Now.ToLongTimeString();
}
// Далее ненужный нам код кнопки
private void Button_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/GamePage.xaml", UriKind.Relative));
}
}
}
Попробуем запустить приложение на эммуляторе…. И оно работает!
Что мы сделали в конечном итоге: мы добавили в конструктор главной страницы запуск новой «нити»(потока), которая каждые 500 мс обновляет время на экране. Главной особенностью обновления времени из нового потока является то, что для этого мы используем специальный объект «Dispatcher», который отвечает за вызовы методов между разными нитями.
Таким образом, какие выводы можно сделать из данного простого приложения
- Разработка WP7 приложений похожа на разработку для настольных приложений
- При использование новых нитей надо не забывать про Dispatcher и усыпление потоков.
При проверке на HTC 7 Mozart with Windows Phone результаты совпали с результатами на эмуляторе.
Спасибо за внимание!
Итак, какое же программное обеспечение требуется для того, чтобы начать разработку под WP7? Т.к. платформа новая, то может сложиться впечатление, что разработка под нее будет «не заточенной». Так это не так!!!
Для этого требуется установить:
- Visual Studio 2010 (не Express)
- SP1 for VS 2010 (http://www.microsoft.com/downloads/ru-r
u/details.aspx?familyid=75568aa6-8107-47 5d-948a-ef22627e57a5) - SDK for WP7 (http://www.microsoft.com/downloads/ru-r
u/details.aspx?FamilyID=0a373422-6680-46 a7-89e1-e9a468a14259)
В случае, если Вы разрабатываете с помощью VS, то Вам потребуется установить только 3 пункт.
Зачем нужен HTC Mozart with Windows Phone
- Одна из самых полезных функций для работы – моментальная проверка почты и возможность также оперативно на нее отвечать.
- Интеграция контактов с sim карты и социальных сетей. При этом, если телефон потеряется или что-то с ним произойдет все контакты сохранятся в вашей записной книжке LiveID
- Чтение книг в транспорте
- Занесение заметок в него и использование, как записной книжки
- Ориентироваться на местности благодаря удобным картам
Какие еще «вкусности»
1. Поиск телефона, его блокировка и стирание всех личных данных с него удаленно через сайт windowsphone.com. Это значительно повышает шансы найти телефон при его потере
2. Огромное количество развлекательных приложений
3. Удобный, уникальный интерфейс
Вот получился такой кусочек кода, где есть Y-Combinator и функция факториала, написанная в саморекурсивной форме, используя только безымянные функции:
function write(x)
{
document.getElementById('YCombinato
}
function YCombinator(f)
{
return function (x)
{
return (f(YCombinator(f)))(x);
};
}
var factor = function (fact)
{
return function (x)
{
return (x<=1)?1:fact(x-1)*x;
};
};
write(YCombinator(factor)(5));
Результатом будет 120, как и ожидалось.
Выводы:
- Вид самого Y-Combinatora получился довольно изящный
- Написание саморекурсивных безымянных функций слегка громоздко
- Использовать можно, но весьма на любителя
- Location:Home
- Mood:
good
2 удар. Делая что-то аналогичное во второй раз, Вы морщитесь от необходимости повторения, но все-таки повторяете тоже самое.
3 удар. Делая что-то похожее в третий раз, вы начинаете рефакторинг.
© Martin Fauler
- Mood:
:) - Music:Miriada - Забытые Мечты
Определение. ВМТ - это вид недетерминированной машины Тьюринга, в котором каждый шаг, где есть недетерменированный выбор, делается случайно.
При этом, существует 2 способа (при желании можно создать гораздо больше способов) определения случайного шага:
- Мы создаем такое устройство, которое будет эмулировать подкидывание монетки, тогда, очевидно, мы сможем выбрать следующий шаг случайно.
- Создаем у нашей МТ (машины Тьюринга) вторую полубесконечную ленту, на которой записана в случайном порядке последовательность 0 и 1. Далее, будем использовать эту ленту, как устройство, описанное в пункте 1.
Тогда определим вероятность того, что ВМТ М допускает слово w:
Так же очевидна следующая формула:
- Если w∈A, тогда Pr[M допускает w] ≥ 1 - ε, и
- если w∉A, тогда Pr[M отвергает w] ≥ 1 - ε.
На самом деле возникает вопрос, почему взято именно число 1/3. Ответ следует после следующей леммы:
Лемма. Пусть есть фиксированная константа ε находящаяся в промежутке от 0 до 0.5. Тогда для любой полиномиальной функции poly(n) ВМТ, вычислимая за полиномиальное время, M1 с ошибкой ε эквивалентна ВМТ, вычислимой за полиномиальное время, M2 с вероятностной ошибкой 2-poly(n).
Таким образом, 1/3 взята просто из критерия того, что 0<1/3<1/2.
- Location:Дома
- Mood:
:) - Music:Maximum The Hormone
let L = [1;2;3;4;5;6]; - Создаем основной список
Основной способ создания двунаправленного списка - это разделение основного списка на два списка (будет создана пара списков). Первый список будет хранить пройденные элементы, а второй еще не пройденные элементы. Тогда Движение по списку будет осуществленно следующим образом:
let iteratorNext j=
let Next m=
match m with
|(h,[])->(h,[])
|(h,h1::t1)->(h1::h,t1)
Next j
;; - Движение по списку вперед (подается в функцию пара списков)
let iteratorPrev j=
let Prev m=
match m with
|([],h)->([],h)
|(h::t,h1)->(t,h::h1)
Prev j
;; - Движение по списку назад (подается в функцию пара списков)
Остается теперь только создать функцию получения элемента из списка. Мы просто будем брать первый элемент из второго списка в паре:
let GetElement k =
match k with
|(h,h1::t1) -> h1
;; - Получение элемента списка
Ну и для примера, мы пройдем по списку 2 раза вперед, один раз назад и получим элемент из него:
let GetElement k =
match k with
|(h,h1::t1) -> h1
;; - будет выведено число "2"
Вот вроде мы и получили двунаправленный список! :)
- Mood:
good
Недавно вышел Microsoft Security Essentials. Сегодня поставил. Эффективность оценить еще не сумел, но зато не тормозит систему, что не может не радовать=)
- Mood:
good
Так же порадовал PowerShell. В-общем, мне пока всё нравится=)
- Mood:
good