<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог Сергея Пугачёва &#187; Silverlight</title>
	<atom:link href="http://pugachev.info/archives/tag/silverlight/feed" rel="self" type="application/rss+xml" />
	<link>http://pugachev.info</link>
	<description>Полезное место для Silverlight разработчиков</description>
	<lastBuildDate>Thu, 24 Nov 2011 12:58:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Silverlight 5, XAML и связывание данных</title>
		<link>http://pugachev.info/archives/811</link>
		<comments>http://pugachev.info/archives/811#comments</comments>
		<pubDate>Mon, 30 May 2011 07:51:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[DevCon]]></category>
		<category><![CDATA[Silverlight 5]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=811</guid>
		<description><![CDATA[В рамках on-line части конференции DevCon&#8217;11 я зыписал доклад Silverlight 5, XAML и связывание данных.]]></description>
			<content:encoded><![CDATA[<p>В рамках on-line части конференции DevCon&#8217;11 я зыписал доклад <a href="http://www.techdays.ru/videos/3572.html">Silverlight 5, XAML и связывание данных</a>. </p>
<p><iframe style="WIDTH: 470px; HEIGHT: 410px" src="http://www.techdays.ru/LectureViewer.aspx?LectureId=65ddb655-e4ce-4e71-b674-793b11a0f9d8" frameBorder=0 scrolling=no mce_src="http://www.techdays.ru/LectureViewer.aspx?LectureId=65ddb655-e4ce-4e71-b674-793b11a0f9d8"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/811/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>45 дней с Windows Phone 7. День #24. WebBrowser. Часть 2. Локальный контент.</title>
		<link>http://pugachev.info/archives/762</link>
		<comments>http://pugachev.info/archives/762#comments</comments>
		<pubDate>Thu, 03 Feb 2011 18:37:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=762</guid>
		<description><![CDATA[&#60;&#60; День #23. Реклама в WP7 приложениях. Это двадцать четвёртая статья серии «45 дней с Windows Phone 7». В Дне #18 мы подробно рассматривали возможности элемента управления «WebBrowser». После этого мне было задано достаточно много вопросов, преимущественно о том, как загружать локальные ресурсы, в первую очередь картинки, в данный элемент управления. Если картинка находится на [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pugachev.info/archives/741">&lt;&lt; День #23. Реклама в WP7 приложениях.</a></p>
<p>Это двадцать четвёртая статья серии «<a href="http://pugachev.info/windowsphone7">45 дней с Windows Phone 7</a>».</p>
<p>В <a href="http://pugachev.info/archives/622">Дне #18</a> мы подробно рассматривали возможности элемента управления «WebBrowser». После этого мне было задано достаточно много вопросов, преимущественно о том, как загружать локальные ресурсы, в первую очередь картинки, в данный элемент управления. Если картинка находится на удалённом web сервере, то проблем нет. Мы просто пишем её Url адрес. Но что делать, если картинка находится в ресурсах приложения? Ведь метод «NavigateToString» браузера не позволяет задать местоположение, загружаемых ресурсов.</p>
<p>На помощь нам приходит изолированное хранилище. Мы уже рассматривали данную тему в <a href="http://pugachev.info/archives/569">Дне #15</a>. В изолированное хранилище  можно положить HTML страницы и ресурсы к ним, такие как картинки, а после этого отобразить данные страницы в элементе управления «WebBrowser».</p>
<h3>Отображение в «WebBrowser» страниц из изолированного хранилища.</h3>
<p>Создадим новое приложение и разместим на главной странице элемент управления «WebBrowser» с именем  «webBrowser1». Подпишемся на событие «Loaded» созданного элемента управления. Но перед тем как создать обработчик события, добавим функцию сохранения текстовых файлов в изолированном хранилище:</p>
<pre>private static void SaveToIsoStore(string fileName, string text)
{
    var isoStore = IsolatedStorageFile.GetUserStoreForApplication();
    if (isoStore.FileExists(fileName))
        isoStore.DeleteFile(fileName);

    using (var sw = new StreamWriter(isoStore.CreateFile(fileName)))
    {
        sw.Write(text);
    }
}</pre>
<p>Данная функция принимает имя и содержимое файла, который потом создаётся в изолированном хранилище.</p>
<p>Теперь с помощью данной функции создадим файл «fileName123.htm» и отобразим его в элементе управления «WebBrowser»:</p>
<pre>private void WebBrowser1Loaded(object sender, RoutedEventArgs e)
{
    SaveToIsoStore("fileName123.htm", "&lt;h1&gt;Isolated Storage!!!&lt;/h1&gt;");
    webBrowser1.Navigate(new Uri("fileName123.htm", UriKind.Relative));
}</pre>
<p>Всё верно, мы можем просто передать имя файла относительно корня изолированного хранилища элементу управления «WebBrowser».</p>
<h3>Сохранение данных из ресурсов приложения в изолированное хранилище.</h3>
<p>К сожалению, мы не можем также легко передать браузеру имя файла из ресурсов приложения, как это было в случае с файлами в изолированном хранилище. Поэтому вначале нам требуется сохранить файл из ресурсов в изолированном хранилище.</p>
<p>Добавим в проект два файла: «readme.htm» и «windows-phone-7.jpg» и установим свойство «Build Action» для файлов в значение «Content».</p>
<p>Файл  «readme.htm»  &#8211; это просто html страница, на которой находится картинка «windows-phone-7.jpg»:</p>
<pre>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" &gt;
&lt;head&gt;
    &lt;title&gt;Untitled Page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h2&gt;Windows Phone 7!&lt;/h2&gt;
&lt;h3&gt;Замечательная ОС&lt;/h3&gt;
&lt;img src="windows-phone-7.jpg" /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Теперь создадим функцию сохранения в изолированном хранилище любого файла, а не только текстового, как это было в первом примере:</p>
<pre>private static void SaveToIsoStore(string fileName, byte[] data)
{
    var strBaseDir = string.Empty;
    const string delimStr = "/";
    var delimiter = delimStr.ToCharArray();
    var dirsPath = fileName.Split(delimiter);

    var isoStore = IsolatedStorageFile.GetUserStoreForApplication();

    for (var i = 0; i &lt; dirsPath.Length - 1; i++)
    {
        strBaseDir = Path.Combine(strBaseDir, dirsPath[i]);
        isoStore.CreateDirectory(strBaseDir);
    }

    if (isoStore.FileExists(fileName))
    {
        isoStore.DeleteFile(fileName);
    }

    using (var bw = new BinaryWriter(isoStore.CreateFile(fileName)))
    {
        bw.Write(data);
        bw.Close();
    }
}</pre>
<p>Воспользуемся данной функцией и сохраним нужные нам файлы из ресурсов приложения. Кроме того, после сохранения файлов, перейдём в браузере на только что сохранённую страницу «readme.htm»:</p>
<pre>private void WebBrowser1Loaded(object sender, RoutedEventArgs e)
{
    string[] files = {
                        "readme.htm",
                        "windows-phone-7.jpg"
                        };

    foreach (var f in files)
    {
        var sr = Application.GetResourceStream(new Uri(f, UriKind.Relative));
        using (var br = new BinaryReader(sr.Stream))
        {
            var data = br.ReadBytes((int)sr.Stream.Length);
            SaveToIsoStore(f, data);
        }
    }

    webBrowser1.Navigate(new Uri("readme.htm", UriKind.Relative));
}</pre>
<p>Запустим приложение и увидим страницу с находящейся на ней картинкой:</p>
<p><img src="http://pugachev.info/wp-content/uploads/2011/02/wp7wb.jpg"/></p>
<p>Примите во внимание, что в реальном приложении не стоит каждый раз при загрузке сохранять файлы из ресурсов в изолированное хранилище. Код требует оптимизации.</p>
<h3>Пример кода.</h3>
<p><iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-c78cd5219d383817.office.live.com/embedicon.aspx/.Public/day24.zip"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/762/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>45 дней с Windows Phone 7. День #23. Реклама в WP7 приложениях.</title>
		<link>http://pugachev.info/archives/741</link>
		<comments>http://pugachev.info/archives/741#comments</comments>
		<pubDate>Tue, 25 Jan 2011 10:54:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=741</guid>
		<description><![CDATA[&#60;&#60; День #22. Trial (пробная) версия приложения.&#124;&#160;День #24. WebBrowser. Часть 2. Локальный контент. &#62;&#62; Это двадцать третья статья серии «45 дней с Windows Phone 7». В предыдущей статье мы говорили о том, как сделать пробную (trial) версию Windows Phone 7 приложения. Эта версия, по сути, предназначена для того, чтобы приложение лучше продавалось. Сегодня мы узнаем, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pugachev.info/archives/720">&lt;&lt; День #22. Trial (пробная) версия приложения.</a>|&nbsp;<a href="http://pugachev.info/archives/762">День #24. WebBrowser. Часть 2. Локальный контент. &gt;&gt;</a></p>
<p>Это двадцать третья статья серии «<a href="http://pugachev.info/windowsphone7">45 дней с Windows Phone 7</a>».</p>
<p>В предыдущей статье мы говорили о том, как сделать пробную (trial) версию Windows Phone 7 приложения. Эта версия, по сути, предназначена для того, чтобы приложение лучше продавалось. Сегодня мы узнаем, как можно заработать, даже создавая бесплатные приложения. А если говорить более конкретно, рассмотри, как можно добавить в приложения рекламу с помощью Microsoft Advertising SDK for Windows Phone 7.</p>
<p><font color="red">Примите во внимание, что вывод денег, полученных от рекламы в Россию недоступен.</font>  Требуется искать обходные пути. Здесь ситуация почти как с PayPal.</p>
<h3>С чего начать?</h3>
<p>В первую очередь стоит посетить <a href="http://advertising.microsoft.com/mobile-apps">Microsoft Advertising pubCenter</a>. На данном сайте описана последовательность шагов, необходимых для показа рекламы в Ваших приложениях: получение SDK, регистрация приложения, добавление рекламных элементов управления на страницы.</p>
<p>Так как данная серия ориентирована на разработчиков, здесь мы также рассмотрим работу с элементом управления «AdControl», служащим для показа рекламы.</p>
<h3>Работа с элементом управления «AdControl».</h3>
<p>Для начала Advertising SDK, в состав которого входит нужный нам элемент управления, требуется скачать и установить. Если Вы не читали предыдущий параграф и поэтому не посещали <a href="http://advertising.microsoft.com/mobile-apps">Microsoft Advertising pubCenter</a>, то можете скачать SDK напрямую:</p>
<p><a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b0f00afc-9709-4cc2-ba2c-57728db6cbd6">http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b0f00afc-9709-4cc2-ba2c-57728db6cbd6</a></p>
<p>Установив SDK, добавим элемент управления «AdControl» на Toolbox в Visual Studio, как мы это делали с элементом управления «Panorama» в <a href="http://pugachev.info/archives/586">Дне #16</a>.</p>
<p>Теперь разместим элемент управления на главной странице нашего приложения:</p>
<pre>&lt;ad:AdControl AdUnitId="Image480_80" ApplicationId="test_client" /&gt;</pre>
<p>Нам требуется задать два обязательных свойства: AdUnitId и ApplicationId. Значения обоих свойств можно получить, зарегистрировав приложение в <a href="http://advertising.microsoft.com/mobile-apps">Microsoft Advertising pubCenter</a>, создав там новый Ad Unit (рекламную единицу) и задав все необходимые настройки.</p>
<p><img src="http://pugachev.info/wp-content/uploads/2011/01/newadunit.png" alt="" /></p>
<h3>Использование тестовых значений при работе с «AdControl».</h3>
<p>При разработке и тестировании приложений, содержащих рекламу, не стоит использовать настоящие значения AdUnitId и ApplicationId. Поскольку это будет выглядеть как нелегальное накручивания себе количества кликов и показов. Кроме того, «AdControl» может распознать, когда работает в эмуляторе, и не будет показывать настоящую рекламу в этом случае.</p>
<p>Далее я приведу тестовые значения, которые стоит использовать при отладке:</p>
<table border="0" cellspacing="0" cellpadding="2" width="600">
<tbody>
<tr>
<td width="120" valign="top"><strong>Ad Type</strong></td>
<td width="120" valign="top"><strong>Ad Model</strong></td>
<td width="120" valign="top"><strong>Size (WxH)</strong></td>
<td width="120" valign="top"><strong>Test ApplicationId</strong></td>
<td width="120" valign="top"><strong>Test AdUnitId</strong></td>
</tr>
<tr>
<td width="120" valign="top">Text Ad</td>
<td width="120" valign="top">Contextual</td>
<td width="120" valign="top">480 x 80</td>
<td width="120" valign="top">test_client</td>
<td width="120" valign="top">TextAd</td>
</tr>
<tr>
<td width="120" valign="top">XXL Image Banner</td>
<td width="120" valign="top">Contextual</td>
<td width="120" valign="top">480 x 80</td>
<td width="120" valign="top">test_client</td>
<td width="120" valign="top">Image480_80</td>
</tr>
<tr>
<td width="120" valign="top">XL Image Banner</td>
<td width="120" valign="top">Contextual</td>
<td width="120" valign="top">300 x 50</td>
<td width="120" valign="top">test_client</td>
<td width="120" valign="top">Image300_50</td>
</tr>
</tbody>
</table>
<p>В примере выше я использовал «Image480_80» баннер, который, как нетрудно догадаться из названия, будет занимать на экране область размером 480 на 80 пикселей.</p>
<h3>Что такое «Ad Unit»?</h3>
<p>Рекламные единицы (ad units) задают основные настройки рекламы. В том числе ту категорию рекламных объявлений, которая будет показываться. Допустим, мы создаём приложение «Таймер чистки зубов». Данное приложение поможет детям определить, сколько времени чистить каждую область рта. Поскольку родители тоже, скорее всего, захотят посмотреть, сколько их ребёнок чистит зубы, реклама в данном приложении будет в самый раз. Но не показывать же в этот момент рекламу, связанную с программированием на C++??? Требуется что-то более подходящее.</p>
<p>Для каждой рекламной единицы мы можем определить категории рекламных объявлений. Категорий достаточно много (примерно 385) и Вы можете выбрать несколько из них, но не более трёх. Вот как выглядит список категорий:</p>
<select size="20">
<option class="bold" value="11000">Law, Gov&#8217;t &amp; Politics &#8211; All</option>
<option value="11005">Law, Gov&#8217;t &amp; Politics &#8211; Commentary</option>
<option value="11004">Law, Gov&#8217;t &amp; Politics &#8211; Politics</option>
<option value="11003">Law, Gov&#8217;t &amp; Politics &#8211; U.S. Government Resources</option>
<option value="11002">Law, Gov&#8217;t &amp; Politics &#8211; Legal Issues</option>
<option value="11001">Law, Gov&#8217;t &amp; Politics &#8211; Immigration</option>
<option class="bold" value="12100">Shopping &#8211; All</option>
<option value="12102">Shopping &#8211; Coupons</option>
<option value="12101">Shopping &#8211; Contests &amp; Freebies</option>
<option value="12104">Shopping &#8211; Engines</option>
<option value="12103">Shopping &#8211; Comparison</option>
<option class="bold" value="12000">Real Estate &#8211; All</option>
<option value="12003">Real Estate &#8211; Buying/Selling Homes</option>
<option value="12002">Real Estate &#8211; Architects</option>
<option value="12001">Real Estate &#8211; Apartments</option>
<option class="bold" value="10800">Hobbies &amp; Interests &#8211; All</option>
<option value="10831">Hobbies &amp; Interests &#8211; Woodworking</option>
<option value="10830">Hobbies &amp; Interests &#8211; Video &amp; Computer Games</option>
<option value="10829">Hobbies &amp; Interests &#8211; Stamps &amp; Coins</option>
<option value="10828">Hobbies &amp; Interests &#8211; Screenwriting</option>
<option value="10827">Hobbies &amp; Interests &#8211; Scrapbooking</option>
<option value="10826">Hobbies &amp; Interests &#8211; Sci-Fi &amp; Fantasy</option>
<option value="10825">Hobbies &amp; Interests &#8211; Roleplaying Games</option>
<option value="10824">Hobbies &amp; Interests &#8211; Radio</option>
<option value="10823">Hobbies &amp; Interests &#8211; Photography</option>
<option value="10822">Hobbies &amp; Interests &#8211; Painting</option>
<option value="10821">Hobbies &amp; Interests &#8211; Needlework</option>
<option value="10817">Hobbies &amp; Interests &#8211; Home Recording</option>
<option value="10816">Hobbies &amp; Interests &#8211; Guitar</option>
<option value="10811">Hobbies &amp; Interests &#8211; Comic Books</option>
<option value="10810">Hobbies &amp; Interests &#8211; Collecting</option>
<option value="10809">Hobbies &amp; Interests &#8211; Cigars</option>
<option value="10808">Hobbies &amp; Interests &#8211; Chess</option>
<option value="10807">Hobbies &amp; Interests &#8211; Card Games</option>
<option value="10806">Hobbies &amp; Interests &#8211; Candle &amp; Soap Making</option>
<option value="10805">Hobbies &amp; Interests &#8211; Boardgames/Puzzles</option>
<option value="10804">Hobbies &amp; Interests &#8211; Birdwatching</option>
<option value="10803">Hobbies &amp; Interests &#8211; Beadwork</option>
<option value="10802">Hobbies &amp; Interests &#8211; Arts &amp; Crafts</option>
<option value="10801">Hobbies &amp; Interests &#8211; Art/Technology</option>
<option value="10820">Hobbies &amp; Interests &#8211; Magic &amp; Illusion</option>
<option value="10819">Hobbies &amp; Interests &#8211; Jewelry Making</option>
<option value="10818">Hobbies &amp; Interests &#8211; Investors &amp; Patents</option>
<option value="10815">Hobbies &amp; Interests &#8211; Getting Published</option>
<option value="10814">Hobbies &amp; Interests &#8211; Genealogy</option>
<option value="10813">Hobbies &amp; Interests &#8211; Freelance Writing</option>
<option value="10812">Hobbies &amp; Interests &#8211; Drawing/Sketching</option>
<option class="bold" value="11900">Travel &#8211; All</option>
<option value="11923">Travel &#8211; South America</option>
<option value="11922">Travel &#8211; National Parks</option>
<option value="11921">Travel &#8211; Mexico &amp; Central America</option>
<option value="11918">Travel &#8211; Hotels</option>
<option value="11917">Travel &#8211; Honeymoons/Getaways</option>
<option value="11916">Travel &#8211; Greece</option>
<option value="11915">Travel &#8211; France</option>
<option value="11902">Travel &#8211; Africa</option>
<option value="11901">Travel &#8211; Adventure Travel</option>
<option value="11927">Travel &#8211; United Kingdom</option>
<option value="11926">Travel &#8211; Traveling with Kids</option>
<option value="11925">Travel &#8211; Theme Parks</option>
<option value="11924">Travel &#8211; Spas</option>
<option value="11920">Travel &#8211; Japan</option>
<option value="11919">Travel &#8211; Italy</option>
<option value="11914">Travel &#8211; Europe</option>
<option value="11913">Travel &#8211; Eastern Europe</option>
<option value="11912">Travel &#8211; Cruises</option>
<option value="11911">Travel &#8211; Caribbean</option>
<option value="11910">Travel &#8211; Canada</option>
<option value="11909">Travel &#8211; Camping</option>
<option value="11908">Travel &#8211; By US Locale</option>
<option value="11907">Travel &#8211; Business Travel</option>
<option value="11906">Travel &#8211; Budget Travel</option>
<option value="11905">Travel &#8211; Bed &amp; Breakfasts</option>
<option value="11904">Travel &#8211; Australia &amp; New Zealand</option>
<option value="11903">Travel &#8211; Air Travel</option>
<option class="bold" value="10700">Food &amp; Drink &#8211; All</option>
<option value="10718">Food &amp; Drink &#8211; Wine</option>
<option value="10717">Food &amp; Drink &#8211; Vegetarian</option>
<option value="10716">Food &amp; Drink &#8211; Vegan</option>
<option value="10715">Food &amp; Drink &#8211; Mexican Cuisine</option>
<option value="10714">Food &amp; Drink &#8211; Japanese Cuisine</option>
<option value="10713">Food &amp; Drink &#8211; Italian Cuisine</option>
<option value="10712">Food &amp; Drink &#8211; Health/Low Fat Cooking</option>
<option value="10711">Food &amp; Drink &#8211; French Cuisine</option>
<option value="10710">Food &amp; Drink &#8211; Food Allergies</option>
<option value="10709">Food &amp; Drink &#8211; Dining Out</option>
<option value="10708">Food &amp; Drink &#8211; Desserts &amp; Baking</option>
<option value="10707">Food &amp; Drink &#8211; Cuisine Specific</option>
<option value="10706">Food &amp; Drink &#8211; Coffee/Tea</option>
<option value="10705">Food &amp; Drink &#8211; Cocktails/Beer</option>
<option value="10704">Food &amp; Drink &#8211; Chinese Cuisine</option>
<option value="10703">Food &amp; Drink &#8211; Cajuns/Creole</option>
<option value="10702">Food &amp; Drink &#8211; Barbecues &amp; Grilling</option>
<option value="10701">Food &amp; Drink &#8211; American Cuisine</option>
<option class="bold" value="11800">Technology &amp; Computing &#8211; All</option>
<option value="11839">Technology &amp; Computing &#8211; Windows</option>
<option value="11838">Technology &amp; Computing &#8211; Web Search</option>
<option value="11837">Technology &amp; Computing &#8211; Web Design/HTML</option>
<option value="11836">Technology &amp; Computing &#8211; Web Clip Art</option>
<option value="11835">Technology &amp; Computing &#8211; Visual Basic</option>
<option value="11834">Technology &amp; Computing &#8211; Unix</option>
<option value="11833">Technology &amp; Computing &#8211; Shareware/Freeware</option>
<option value="11832">Technology &amp; Computing &#8211; Entertainment</option>
<option value="11831">Technology &amp; Computing &#8211; Portable</option>
<option value="11830">Technology &amp; Computing &#8211; PC Support</option>
<option value="11829">Technology &amp; Computing &#8211; Palmtops/PDAs</option>
<option value="11828">Technology &amp; Computing &#8211; Network Security</option>
<option value="11827">Technology &amp; Computing &#8211; Net for Beginners</option>
<option value="11826">Technology &amp; Computing &#8211; Net Conferencing</option>
<option value="11825">Technology &amp; Computing &#8211; MP3/MIDI</option>
<option value="11824">Technology &amp; Computing &#8211; Mac Support</option>
<option value="11823">Technology &amp; Computing &#8211; Mac OS</option>
<option value="11822">Technology &amp; Computing &#8211; Linux</option>
<option value="11802">Technology &amp; Computing &#8211; Animation</option>
<option value="11801">Technology &amp; Computing &#8211; 3-D Graphics</option>
<option value="11821">Technology &amp; Computing &#8211; JavaScript</option>
<option value="11820">Technology &amp; Computing &#8211; Java</option>
<option value="11819">Technology &amp; Computing &#8211; Internet Technology</option>
<option value="11818">Technology &amp; Computing &#8211; Home Video/DVD</option>
<option value="11817">Technology &amp; Computing &#8211; Graphics Software</option>
<option value="11816">Technology &amp; Computing &#8211; Email</option>
<option value="11815">Technology &amp; Computing &#8211; Desktop Video</option>
<option value="11814">Technology &amp; Computing &#8211; Desktop Publishing</option>
<option value="11813">Technology &amp; Computing &#8211; Databases</option>
<option value="11812">Technology &amp; Computing &#8211; Data Centers</option>
<option value="11811">Technology &amp; Computing &#8211; Computer Reviews</option>
<option value="11810">Technology &amp; Computing &#8211; Computer Peripherals</option>
<option value="11809">Technology &amp; Computing &#8211; Computer Networking</option>
<option value="11808">Technology &amp; Computing &#8211; Computer Certification</option>
<option value="11807">Technology &amp; Computing &#8211; Cell Phones</option>
<option value="11806">Technology &amp; Computing &#8211; Camcorders</option>
<option value="11805">Technology &amp; Computing &#8211; Cameras</option>
<option value="11804">Technology &amp; Computing &#8211; C/C++</option>
<option value="11803">Technology &amp; Computing &#8211; Antivirus Software</option>
<option class="bold" value="10600">Health &amp; Fitness &#8211; ALL</option>
<option value="10603">Health &amp; Fitness &#8211; AIDS/HIV</option>
<option value="10647">Health &amp; Fitness &#8211; Women&#8217;s Health</option>
<option value="10646">Health &amp; Fitness &#8211; Weight Loss</option>
<option value="10645">Health &amp; Fitness &#8211; Thyroid Disease</option>
<option value="10644">Health &amp; Fitness &#8211; Substance Abuse</option>
<option value="10643">Health &amp; Fitness &#8211; Smoking Cessation</option>
<option value="10642">Health &amp; Fitness &#8211; Sleep Disorders</option>
<option value="10641">Health &amp; Fitness &#8211; Sexuality</option>
<option value="10640">Health &amp; Fitness &#8211; Senior Health</option>
<option value="10639">Health &amp; Fitness &#8211; Psychology/Psychiatry</option>
<option value="10638">Health &amp; Fitness &#8211; Physical Therapy</option>
<option value="10637">Health &amp; Fitness &#8211; Pediatrics</option>
<option value="10636">Health &amp; Fitness &#8211; Disorders</option>
<option value="10635">Health &amp; Fitness &#8211; Panic/Anxiety</option>
<option value="10634">Health &amp; Fitness &#8211; Orthopedics</option>
<option value="10633">Health &amp; Fitness &#8211; Nutrition</option>
<option value="10632">Health &amp; Fitness &#8211; Men&#8217;s Health</option>
<option value="10631">Health &amp; Fitness &#8211; Infertility</option>
<option value="10630">Health &amp; Fitness &#8211; Incontinence</option>
<option value="10629">Health &amp; Fitness &#8211; Incest/Abuse Support</option>
<option value="10628">Health &amp; Fitness &#8211; IBS/Crohn&#8217;s Disease</option>
<option value="10627">Health &amp; Fitness &#8211; Holistic Healing</option>
<option value="10626">Health &amp; Fitness &#8211; Herbs for Health</option>
<option value="10625">Health &amp; Fitness &#8211; Heart Disease</option>
<option value="10624">Health &amp; Fitness &#8211; Headaches/Migraines</option>
<option value="10623">Health &amp; Fitness &#8211; GERD/Acid Reflux</option>
<option value="10622">Health &amp; Fitness &#8211; Epilepsy</option>
<option value="10621">Health &amp; Fitness &#8211; Diabetes</option>
<option value="10620">Health &amp; Fitness &#8211; Dermatology</option>
<option value="10619">Health &amp; Fitness &#8211; Depression</option>
<option value="10618">Health &amp; Fitness &#8211; Dental Care</option>
<option value="10617">Health &amp; Fitness &#8211; Deafness</option>
<option value="10616">Health &amp; Fitness &#8211; Cold &amp; Flu</option>
<option value="10615">Health &amp; Fitness &#8211; Chronic Pain</option>
<option value="10614">Health &amp; Fitness &#8211; Syndrome</option>
<option value="10613">Health &amp; Fitness &#8211; Chronic Fatigue</option>
<option value="10612">Health &amp; Fitness &#8211; Cholesterol</option>
<option value="10611">Health &amp; Fitness &#8211; Cancer</option>
<option value="10610">Health &amp; Fitness &#8211; Brain Tumor</option>
<option value="10609">Health &amp; Fitness &#8211; Bipolar Disorder</option>
<option value="10608">Health &amp; Fitness &#8211; Autism/PDD</option>
<option value="10607">Health &amp; Fitness &#8211; Asthma</option>
<option value="10606">Health &amp; Fitness &#8211; Arthritis</option>
<option value="10605">Health &amp; Fitness &#8211; Alternative Medicine</option>
<option value="10604">Health &amp; Fitness &#8211; Allergies</option>
<option value="10602">Health &amp; Fitness &#8211; A.D.D.</option>
<option value="10601">Health &amp; Fitness &#8211; Exercise</option>
<option class="bold" value="11700">Style &amp; Fashion &#8211; All</option>
<option value="11705">Health &amp; Fitness &#8211; Clothing</option>
<option value="11704">Health &amp; Fitness &#8211; Jewelry</option>
<option value="11703">Health &amp; Fitness &#8211; Fashion</option>
<option value="11706">Health &amp; Fitness &#8211; Accessories</option>
<option value="11702">Health &amp; Fitness &#8211; Body Art</option>
<option value="11701">Health &amp; Fitness &#8211; Beauty</option>
<option class="bold" value="10500">Family Planning &#8211; All</option>
<option value="10509">Family Planning &#8211; Eldercare</option>
<option value="10508">Family Planning &#8211; Special Need Kids</option>
<option value="10507">Family Planning &#8211; Pregnancy</option>
<option value="10506">Family Planning &#8211; Parenting Teens</option>
<option value="10505">Family Planning &#8211; Parenting-K-6 Kids</option>
<option value="10504">Family Planning &#8211; Family Internet</option>
<option value="10503">Family Planning &#8211; Daycare/Pre-School</option>
<option value="10502">Family Planning &#8211; Babies &amp; Toddlers</option>
<option value="10501">Family Planning &#8211; Adoption</option>
<option class="bold" value="11600">Sports &#8211; All</option>
<option value="11612">Sports &#8211; Football</option>
<option value="11611">Sports &#8211; Fly Fishing</option>
<option value="11610">Sports &#8211; Figure Skating</option>
<option value="11609">Sports &#8211; Cricket</option>
<option value="11608">Sports &#8211; Climbing</option>
<option value="11607">Sports &#8211; Cheerleading</option>
<option value="11606">Sports &#8211; Canoeing/Kayaking</option>
<option value="11605">Sports &#8211; Boxing</option>
<option value="11604">Sports &#8211; Bodybuilding</option>
<option value="11603">Sports &#8211; Bicycling</option>
<option value="11644">Sports &#8211; World Soccer</option>
<option value="11643">Sports &#8211; Waterski/Wakeboarding</option>
<option value="11642">Sports &#8211; Walking</option>
<option value="11641">Sports &#8211; Volleyball</option>
<option value="11640">Sports &#8211; Tennis</option>
<option value="11639">Sports &#8211; Table Tennis/Ping Pong</option>
<option value="11638">Sports &#8211; Swimming</option>
<option value="11637">Sports &#8211; Surfing/Bodyboarding</option>
<option value="11636">Sports &#8211; Snowboarding</option>
<option value="11635">Sports &#8211; Skiing</option>
<option value="11634">Sports &#8211; Skateboarding</option>
<option value="11633">Sports &#8211; Scuba Diving</option>
<option value="11632">Sports &#8211; Saltwater Fishing</option>
<option value="11631">Sports &#8211; Sailing</option>
<option value="11630">Sports &#8211; Running/Jogging</option>
<option value="11629">Sports &#8211; Rugby</option>
<option value="11628">Sports &#8211; Rodeo</option>
<option value="11627">Sports &#8211; Pro Ice Hockey</option>
<option value="11626">Sports &#8211; Pro Basketball</option>
<option value="11625">Sports &#8211; Power &amp; Motorcycles</option>
<option value="11624">Sports &#8211; Paintball</option>
<option value="11623">Sports &#8211; Olympics</option>
<option value="11622">Sports &#8211; NASCAR Racing</option>
<option value="11621">Sports &#8211; Mountain Biking</option>
<option value="11620">Sports &#8211; Martial Arts</option>
<option value="11619">Sports &#8211; Inline Skating</option>
<option value="11618">Sports &#8211; Hunting/Shooting</option>
<option value="11617">Sports &#8211; Horses</option>
<option value="11616">Sports &#8211; Horse Racing</option>
<option value="11615">Sports &#8211; Golf</option>
<option value="11614">Sports &#8211; Game &amp; Fish</option>
<option value="11613">Sports &#8211; Freshwater Fishing</option>
<option value="11602">Sports &#8211; Baseball</option>
<option value="11601">Sports &#8211; Auto Racing</option>
<option class="bold" value="12300">Uncategorized &#8211; All</option>
<option value="12301">Uncategorized &#8211; Blind/no site list</option>
<option class="bold" value="11500">Pets &#8211; All</option>
<option value="11507">Pets &#8211; Veterinary Medicine</option>
<option value="11506">Pets &#8211; Reptiles</option>
<option value="11505">Pets &#8211; Large Animals</option>
<option value="11504">Pets &#8211; Dogs</option>
<option value="11503">Pets &#8211; Cats</option>
<option value="11502">Pets &#8211; Birds</option>
<option value="11501">Pets &#8211; Aquariums</option>
<option class="bold" value="10300">Careers &#8211; All</option>
<option value="10311">Careers &#8211; Career Advice</option>
<option value="10310">Careers &#8211; U.S. Military</option>
<option value="10309">Careers &#8211; Telecommuting</option>
<option value="10308">Careers &#8211; Scholarships</option>
<option value="10307">Careers &#8211; Nursing</option>
<option value="10306">Careers &#8211; Resume Writing/Advice</option>
<option value="10305">Careers &#8211; Job Search</option>
<option value="10304">Careers &#8211; Job Fairs</option>
<option value="10303">Careers &#8211; Financial Aid</option>
<option value="10302">Careers &#8211; College</option>
<option value="10301">Careers &#8211; Career Planning</option>
<option class="bold" value="11400">Science &#8211; All</option>
<option value="11410">Science &#8211; Weather</option>
<option value="11409">Science &#8211; Botany</option>
<option value="11408">Science &#8211; Geography</option>
<option value="11407">Science &#8211; Space/Astronomy</option>
<option value="11406">Science &#8211; Physics</option>
<option value="11405">Science &#8211; Paranormal Phenomena</option>
<option value="11404">Science &#8211; Geology</option>
<option value="11403">Science &#8211; Chemistry</option>
<option value="11402">Science &#8211; Biology</option>
<option value="11401">Science &#8211; Astrology</option>
<option class="bold" value="10200">Business &#8211; All</option>
<option value="10212">Business &#8211; Metals</option>
<option value="10211">Business &#8211; Marketing</option>
<option value="10210">Business &#8211; Logistics</option>
<option value="10209">Business &#8211; Human Resources</option>
<option value="10208">Business &#8211; Green Solutions</option>
<option value="10207">Business &#8211; Government</option>
<option value="10206">Business &#8211; Forestry</option>
<option value="10205">Business &#8211; Construction</option>
<option value="10204">Business &#8211; Business Software</option>
<option value="10203">Business &#8211; Biotech/Biomedical</option>
<option value="10202">Business &#8211; Agriculture</option>
<option value="10201">Business &#8211; Advertising</option>
<option class="bold" value="11300">Society &#8211; All</option>
<option value="11308">Society &#8211; Ethnic Specific</option>
<option value="11307">Society &#8211; Weddings</option>
<option value="11306">Society &#8211; Teens</option>
<option value="11305">Society &#8211; Senior Living</option>
<option value="11304">Society &#8211; Marriage</option>
<option value="11303">Society &#8211; Gay Life</option>
<option value="11302">Society &#8211; Divorce Support</option>
<option value="11301">Society &#8211; Dating</option>
<option class="bold" value="10900">Home &amp; Garden &#8211; All</option>
<option value="10909">Home &amp; Garden &#8211; Remodeling &amp; Construction</option>
<option value="10908">Home &amp; Garden &#8211; Landscaping</option>
<option value="10907">Home &amp; Garden &#8211; Interior Decorating</option>
<option value="10906">Home &amp; Garden &#8211; Home Theater</option>
<option value="10905">Home &amp; Garden &#8211; Home Repair</option>
<option value="10904">Home &amp; Garden &#8211; Gardening</option>
<option value="10903">Home &amp; Garden &#8211; Environmental Safety</option>
<option value="10902">Home &amp; Garden &#8211; Entertaining</option>
<option value="10901">Home &amp; Garden &#8211; Appliances</option>
<option class="bold" value="10100">Automotive &#8211; All</option>
<option value="10123">Automotive &#8211; Wagon</option>
<option value="10122">Automotive &#8211; Vintage Cars</option>
<option value="10121">Automotive &#8211; Trucks &amp; Accessories</option>
<option value="10120">Automotive &#8211; Sedan</option>
<option value="10119">Automotive &#8211; Road Side Assistance</option>
<option value="10118">Automotive &#8211; Pickup</option>
<option value="10117">Automotive &#8211; Performance Vehicles</option>
<option value="10116">Automotive &#8211; Off-Road Vehicles</option>
<option value="10115">Automotive &#8211; Motorcycles</option>
<option value="10114">Automotive &#8211; MiniVan</option>
<option value="10113">Automotive &#8211; Luxury</option>
<option value="10112">Automotive &#8211; Hybrid</option>
<option value="10111">Automotive &#8211; Hatchback</option>
<option value="10110">Automotive &#8211; Electric Vehicle</option>
<option value="10109">Automotive &#8211; Diesel</option>
<option value="10108">Automotive &#8211; Crossover</option>
<option value="10107">Automotive &#8211; Coupe</option>
<option value="10106">Automotive &#8211; Convertible</option>
<option value="10105">Automotive &#8211; Certified Pre-Owned</option>
<option value="10104">Automotive &#8211; Car Culture</option>
<option value="10103">Automotive &#8211; Buying/Selling Cars</option>
<option value="10102">Automotive &#8211; Auto Repair</option>
<option value="10101">Automotive &#8211; Auto Parts</option>
<option class="bold" value="11200">Personal Finance &#8211; All</option>
<option value="11212">Personal Finance &#8211; Tax Planning</option>
<option value="11211">Personal Finance &#8211; Stocks</option>
<option value="11210">Personal Finance &#8211; Retirement Planning</option>
<option value="11209">Personal Finance &#8211; Options</option>
<option value="11208">Personal Finance &#8211; Mutual Funds</option>
<option value="11207">Personal Finance &#8211; Investing</option>
<option value="11206">Personal Finance &#8211; Insurance</option>
<option value="11205">Personal Finance &#8211; Hedge Fund</option>
<option value="11204">Personal Finance &#8211; Financial Planning</option>
<option value="11203">Personal Finance &#8211; Financial News</option>
<option value="11202">Personal Finance &#8211; Credit/Debit &amp; Loans</option>
<option value="11201">Personal Finance &#8211; Beginning Investing</option>
<option class="bold" value="10000">Arts &amp; Entertainment &#8211; All</option>
<option value="10007">Arts &amp; Entertainment &#8211; Television</option>
<option value="10006">Arts &amp; Entertainment &#8211; Music</option>
<option value="10005">Arts &amp; Entertainment &#8211; Movies</option>
<option value="10004">Arts &amp; Entertainment &#8211; Humor</option>
<option value="10003">Arts &amp; Entertainment &#8211; Fine Art</option>
<option value="10002">Arts &amp; Entertainment &#8211; Celebrity Fan/Gossip</option>
<option value="10001">Arts &amp; Entertainment &#8211; Books &amp; Literature</option>
<option class="bold" value="11100">News &#8211; All</option>
<option value="11103">News &#8211; Local News</option>
<option value="11102">News &#8211; National News</option>
<option value="11101">News &#8211; International News</option>
<option class="bold" value="12200">Religion &amp; Spirituality &#8211; All</option>
<option value="12210">Religion &amp; Spirituality &#8211; Pagan/Wiccan</option>
<option value="12209">Religion &amp; Spirituality &#8211; Latter-Day Saints</option>
<option value="12208">Religion &amp; Spirituality &#8211; Judaism</option>
<option value="12207">Religion &amp; Spirituality &#8211; Islam</option>
<option value="12206">Religion &amp; Spirituality &#8211; Hinduism</option>
<option value="12205">Religion &amp; Spirituality &#8211; Christianity</option>
<option value="12204">Religion &amp; Spirituality &#8211; Catholicism</option>
<option value="12203">Religion &amp; Spirituality &#8211; Buddhism</option>
<option value="12202">Religion &amp; Spirituality &#8211; Atheism/Agnosticism</option>
<option value="12201">Religion &amp; Spirituality &#8211; Alternative Religions</option>
<option class="bold" value="10400">Education &#8211; All</option>
<option value="10415">Education &#8211; Studying Business</option>
<option value="10414">Education &#8211; Special Education</option>
<option value="10413">Education &#8211; Private School</option>
<option value="10412">Education &#8211; K-6 Educators</option>
<option value="10411">Education &#8211; Homework/Study Tips</option>
<option value="10410">Education &#8211; Homeschooling</option>
<option value="10409">Education &#8211; Graduate School</option>
<option value="10408">Education &#8211; Language Learning</option>
<option value="10407">Education &#8211; English as a 2nd Language</option>
<option value="10406">Education &#8211; Distance Learning</option>
<option value="10405">Education &#8211; College Life</option>
<option value="10404">Education &#8211; College Administration</option>
<option value="10403">Education &#8211; Art History</option>
<option value="10402">Education &#8211; Adult Education</option>
<option value="10401">Education &#8211; 7-12 Education</option>
</select>
<p>Для нашего приложения, помогающего чистить зубы, мы выберем, в том числе категорию «Health &amp; Fitness – Dental Care».</p>
<p>После создания рекламной единицы, скопируем значения «AdUnitId» и «ApplicationId» в pubCenter, и зададим их в нашем элементе управления. Код будет выглядеть примерно так:</p>
<pre>
&lt;ad:AdControl x:Name="AdBox" AdUnitId="10018171"
ApplicationId="350b8257-d92a-4978-a218-f3650bd485df"
Margin="-12,528,-12,0" Width="480" Height="80" /&gt;</pre>
<p>А так будет выглядеть приложение, запущенное в эмуляторе:</p>
<p><img src="http://pugachev.info/wp-content/uploads/2011/01/adwp7.png"/></p>
<h3>Profit!</h3>
<p>Просто добавив рекламный элемент управления в приложение (предположим, что приложение используется реальными людьми), Вы начнёте замечать активность в pubCenter. Кроме того, в pubCenter можно найти несколько метрик, самой главной из которых для Вас является, конечно же, «Revenue» &#8211; доход.</p>
<p>Надо отметить, что есть интересный способ монетизации приложений. В дне #22 мы рассматривали, как сделать пробную версию приложения, но пробная версия не обязательно должна иметь урезанную функциональность. Она может быть полнофункциональной, просто в ней будет показываться реклама. Если пользователь заплатит деньги за приложение – реклама показываться перестанет. Данная модель относительно популярна.</p>
<h3>Пример кода.</h3>
<p><iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-c78cd5219d383817.office.live.com/embedicon.aspx/.Public/Day23-Advertising.zip"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/741/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>45 дней с Windows Phone 7. День #22. Trial (пробная) версия приложения.</title>
		<link>http://pugachev.info/archives/720</link>
		<comments>http://pugachev.info/archives/720#comments</comments>
		<pubDate>Sun, 23 Jan 2011 13:10:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=720</guid>
		<description><![CDATA[&#60;&#60; День #21. Приложения и игры.&#124;&#160;День #23. Реклама в WP7 приложениях. &#62;&#62; Это двадцать вторая статья серии «45 дней с Windows Phone 7». Вчера мы говорили о том, как добавить приложение (игру) в хаб «Games». Сегодня мы узнаем, как сделать триальную (Trial) – пробную версию приложения или игры. На самом деле это не какая-то специализированная [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pugachev.info/archives/705">&lt;&lt;  День #21. Приложения и игры.</a>|&nbsp;<a href="http://pugachev.info/archives/741">День #23. Реклама в WP7 приложениях. &gt;&gt;</a></p>
<p>Это двадцать вторая статья серии «<a href="http://pugachev.info/windowsphone7">45 дней с Windows Phone 7</a>».</p>
<p>Вчера мы говорили о том, как добавить приложение (игру) в хаб «Games». Сегодня мы узнаем, как сделать триальную (Trial) – пробную версию приложения или игры. На самом деле это не какая-то специализированная версия (.xap файл будет тот же), а просто некоторые дополнительные проверки в коде, благодаря которым в процессе работы приложение может изменять функциональность в зависимости от того, в каком режиме работает: полном или пробном. При покупке приложения в Marketplace, пользователь имеет возможность сначала приложение попробовать, а если оно ему понравится – уже заплатить деньги и использовать полную версию.</p>
<p><img src="http://pugachev.info/wp-content/uploads/2011/01/try.jpg"/></p>
<p>Иллюстрация с сайта <a href="http://www.pocketgamer.co.uk/feature.asp?t=how_to&#038;c=24553">pocketgamer.co.uk</a></p>
<p>На иллюстрации процесса покупки видно, что внизу экрана присутствуют две кнопки – попробовать (try) и купить (buy). Типичным примером использования данной функциональности являются игры. Допустим, игра имеет 50 уровней. Тогда разработчик может в пробной версии оставить возможность пройти игру только до 5-ого уровня, а для прохождения остальных будет требоваться покупка игры.</p>
<h3>Использование класса LicenseInformation.</h3>
<p>В пространстве имён «Microsoft.Phone.Marketplace» есть, в том числе класс «LicenseInformation», который позволяет получить информацию о текущем статусе оплаты нашего приложения. Подключим нужное пространство имён:</p>
<pre>
using Microsoft.Phone.Marketplace;
</pre>
<p>Следующим шагом будет создание экземпляра класса «LicenseInformation»:</p>
<pre>
var li = new LicenseInformation();
</pre>
<p>Это почти всё, что требуется сделать. Класс «LicenseInformation» содержит функцию «IsTrial», возвращающую булевское значение и позволяющую определить, работаем ли мы в пробном режиме:</p>
<pre>
if (!li.IsTrial())
{
    //Сделать что-то, доступное только платным пользователям
}
else
{
    //Сделать что-то, доступное пробным пользователям
}
</pre>
<h3>Тестирование пробного режима.</h3>
<p>К сожалению, нет никакого встроенного способа переключения между пробным и полным режимами при разработке приложения («IsTrial()» на эмуляторе возвращает false). Но я использую достаточно простой способ, чтобы иметь возможность отлаживать пробную версию. Для этого я проверяю, находимся ли мы в режиме отладки, и если да, то сохраняю в настройках приложения параметр «trialMode» в значении «true». Делается это в файле «App.xaml.cs»:</p>
<pre>
IsolatedStorageSettings _settings = IsolatedStorageSettings.ApplicationSettings;

public App()
{
    UnhandledException += Application_UnhandledException;

    _settings["trialMode"] = false;

    if (System.Diagnostics.Debugger.IsAttached)
    {
        _settings["trialMode"] = true;

        Application.Current.Host.Settings.EnableFrameRateCounter = true;
    }

    InitializeComponent();

    InitializePhoneApplication();
}
</pre>
<p>В этом случае тестируется пробный режим, а для тестирования полного режима можно закомментировать строчку «_settings["trialMode"] = true;».</p>
<p>Теперь, проверяя в каком режиме работает приложение, требуется читать ещё и значение из настроек. Вот полный код нового варианта такой проверки:</p>
<pre>
LicenseInformation _li = new LicenseInformation();
IsolatedStorageSettings _settings = IsolatedStorageSettings.ApplicationSettings;

// Constructor
public MainPage()
{
    InitializeComponent();

    if (_li.IsTrial() || (bool)_settings["trialMode"])
    {
        //Сделать что-то, доступное пробным пользователям
    }
    else
    {
        //Сделать что-то, доступное только платным пользователям
    }
}
</pre>
<p>Может это и не лучший способ, но он работает. </p>
<p>Определить, работает ли приложение в тестовом или полном режиме очень просто. Вам остаётся только подумать над тем, какую функциональность сделать доступной в тестовом режиме, а это уже сложнее. </p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/720/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>45 дней с Windows Phone 7. День #21. Приложения и игры.</title>
		<link>http://pugachev.info/archives/705</link>
		<comments>http://pugachev.info/archives/705#comments</comments>
		<pubDate>Mon, 17 Jan 2011 16:19:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=705</guid>
		<description><![CDATA[&#60;&#60; День #20. Уведомления (Push Notifications).&#124;&#160;День #22. Trial (пробная) версия приложения. &#62;&#62; Это двадцать первая статья серии «45 дней с Windows Phone 7». Многие разработчики, создающие Windows Phone 7 Silverlight приложения, хотят использовать Silverlight, в том числе и для написания игр. Хотя основной платформой, позволяющей создавать игры для телефонов, является XNA, Silverlight также является мощной [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pugachev.info/archives/664">&lt;&lt; День #20. Уведомления (Push Notifications).</a>|&nbsp;<a href="http://pugachev.info/archives/720">День #22. Trial (пробная) версия приложения. &gt;&gt;</a></p>
<p>Это двадцать первая статья серии «<a href="http://pugachev.info/windowsphone7">45 дней с Windows Phone 7</a>».</p>
<p>Многие разработчики, создающие Windows Phone 7 Silverlight приложения, хотят использовать Silverlight, в том числе и для написания игр. Хотя основной платформой, позволяющей создавать игры для телефонов, является XNA, Silverlight также является мощной платформой для работы с графикой, поэтому игры, написанные на Silverlight, имеют такое же право на существование, как и XNA игры.</p>
<p><img src="http://pugachev.info/wp-content/uploads/2011/01/windows-phone-7-games.jpg" alt="" /></p>
<p>Если Вы создадите Silverlight Windows Phone 7 приложение (или XNA игру) и запустите его на эмуляторе, то данное приложение будет отображаться в списке всех установленных приложений телефона (данный список появляется при нажатии стрелочки вправо на главном экране). Но на реальном телефоне игры отображаются не в данном списке, а в специальном хабе «Games». Есть очень простой способ сделать так, чтобы Ваши приложения тоже отображались в данном хабе. Но делать это стоит, только если приложение действительно являются игрой. Попытка разместить приложение, не являющееся игрой, в хабе «Games» &#8211; повод для отказа в публикации приложения в Marketplace.</p>
<h3>Помните день #1?</h3>
<p>В первом дне данной серии мы рассматривали все файлы, входящие в проект Silverlight Windows Phone 7 приложения. В том числе и файл «WMAppManifest.xml» (он находится в папке «Properties»). Данный файл как раз и позволяет указать, что наше приложение является игрой и будет размещаться в хабе «Games».</p>
<p><img src="http://www.jeffblankenburg.com/image.axd?picture=solutionexplorer_2.png" alt="" /></p>
<p>Внутри файла «WMAppManifest.xml» находятся метаданные приложения, в том его имя, иконка, путь к стартовой странице и.т.д.</p>
<p>Кстати, изменение стартовой страницы – хороший способ ручного тестирования приложения. Например, вместо того, чтобы при отладке вначале загружать какую-то базовую страницу приложения, а уже потом с помощью навигации переходить на ту страницу, которую требуется отладить, можно сразу указать отлаживаемую страницу в качестве стартовой, а также передать ей некоторые параметры. Например, укажем, что вначале будет загружаться страница «ProductPage.xaml»:</p>
<pre>&lt;Tasks&gt;
    &lt;DefaultTask  Name ="_default" NavigationPage="ProductPage.xaml?id=42"/&gt;
&lt;/Tasks&gt;</pre>
<p>Естественно, перед этим страницу «ProductPage.xaml» надо создать. Но вернёмся к задаче размещения нашего приложения в хабе «Games». Для этого изменим свойство «Genre» &#8211; жанр тега «App». Вот как выглядит данный тег по умолчанию (естественно, Ваших приложениях многие значения будут отличаться):</p>
<pre>&lt;App xmlns="" Genre="apps.normal"
ProductID="{6b6bf47b-9652-47d3-8758-fd1b11f99971}"
Title="Day22_AppsVsGames"
RuntimeType="Silverlight" Version="1.0.0.0"
Author="SergeyPugachev"
Description="An amazing demo on how to change your app's location."
Publisher="pugachve.info"&gt;</pre>
<p>Значением жанра по умолчанию является <strong>«apps.normal»</strong>. Поменяем данное значение на используемое для игр: <strong>«apps.games»</strong>.</p>
<p>Теперь после запуска приложения на эмуляторе оно не будет отображаться в стандартном списке приложений, а так как хаба «Games» на эмуляторе нет, то приложение как будто исчезнет с телефона (запускаться из Visual Studio оно, конечно, продолжит). Далее приведу модифицированную версию тега «App»:</p>
<pre>
&lt;App xmlns="" Genre="apps.games"
ProductID="{6b6bf47b-9652-47d3-8758-fd1b11f99971}"
Title="Day22_AppsVsGames"
RuntimeType="Silverlight" Version="1.0.0.0"
Author="SergeyPugachev"
Description="An amazing demo on how to change your app's location."
Publisher="pugachve.info"&gt;</pre>
<p>Теперь при отладке приложения на реальном устройстве, Вы найдёте его в хабе «Games».</p>
<p><img src="http://pugachev.info/wp-content/uploads/2011/01/CIMG1200.jpg"/></p>
<p>На данной фотографии моё приложение Вы найдёте в левом нижнем углу. Оно имеет стандартную иконку.</p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/705/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Видео со мной о Mobile Developer Day.</title>
		<link>http://pugachev.info/archives/701</link>
		<comments>http://pugachev.info/archives/701#comments</comments>
		<pubDate>Wed, 15 Dec 2010 20:33:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Windows Phone7]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=701</guid>
		<description><![CDATA[Первый раз дал кому-то интервью в видео формате.]]></description>
			<content:encoded><![CDATA[<p>Первый раз дал кому-то интервью в видео формате.</p>
<p><object width="470" height="353"><param name="movie" value="http://video.rutube.ru/614d6281792725d9ed6c8ec6f9bbd1c3"></param><param name="wmode" value="window"></param><param name="allowFullScreen" value="true"></param><embed src="http://video.rutube.ru/614d6281792725d9ed6c8ec6f9bbd1c3" type="application/x-shockwave-flash" wmode="window" width="470" height="353" allowFullScreen="true" ></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/701/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>45 дней с Windows Phone 7. День #20. Уведомления (Push Notifications).</title>
		<link>http://pugachev.info/archives/664</link>
		<comments>http://pugachev.info/archives/664#comments</comments>
		<pubDate>Sun, 21 Nov 2010 09:28:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=664</guid>
		<description><![CDATA[&#60;&#60; День #19. Элемент управления Map.&#124;&#160;День #21. Приложения и игры. &#62;&#62; Это двадцатая статья серии «45 дней с Windows Phone 7». Вчера мы говорили об элементе управления «Map», который позволяет добавить картографию в Ваши приложения. Сегодня мы от элементов управления перейдём к более системным вещам. Мы рассмотрим уведомления (Push Notifications). Наверное, это одна из самых [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pugachev.info/archives/640">&lt;&lt;  День #19. Элемент управления Map.</a>|&nbsp;<a href="http://pugachev.info/archives/705">День #21. Приложения и игры. &gt;&gt;</a></p>
<p>Это двадцатая статья серии «<a href="http://pugachev.info/windowsphone7">45 дней с Windows Phone 7</a>».</p>
<p>Вчера мы говорили об элементе управления «Map», который позволяет добавить картографию в Ваши приложения. Сегодня мы от элементов управления перейдём к более системным вещам. Мы рассмотрим уведомления (Push Notifications). Наверное, это одна из самых важных статей в данной серии.</p>
<p>Если Вы не знакомы с концепцией уведомлений, то всё достаточно просто: приложение вместо того, чтобы периодически отправлять запросы на сервер на предмет наличия новых данных, просто ждёт, когда сервер пошлёт уведомление, что новые данные появились. Более того, в некоторых случаях, когда сервер отправляет уведомление, Ваше приложение может быть даже не запущено. Ничего страшного в этом нет.</p>
<h3>Почему уведомления?</h3>
<p>Одним из главных преимуществ является экономия батареи телефона. Постоянная отправка запросов на сервер для проверки на наличие новых данных – это достаточно энергозатратный процесс. А для телефона заряд батарее невероятно важен. Может быть даже важнее всего остального. Его никогда не хватает. И пользователь часто предпочтёт не пользоваться Вашим приложением вообще, чем быстро сажать батарею.</p>
<p>Кроме того, даже если Ваше приложение не запущено, посредством уведомлений Вы можете сообщить пользователю, о том, что происходит что-то интересное, либо просто есть какая-то новая информация. Пользователь сможет открыть Ваше приложение, нажав на уведомление и уже в приложении получить дополнительную информацию.</p>
<h3>Как работают уведомления.</h3>
<p><img src="http://pugachev.info/wp-content/uploads/2010/11/IC3867701_2.jpg" alt="" /></p>
<p>Есть несколько видов уведомлений, но все они работают схожим образом. Во-первых, для работы уведомлений обязательно требуется соединение с интернетом, а дальше происходит следующее:</p>
<ul>
<li>При первом запуске на телефоне приложение обращается к сервису уведомлений (<a href="http://msdn.microsoft.com/en-us/library/ff402558(VS.92).aspx">Microsoft’s Push Notification service</a>), который возвращает URI. С помощью данного URI серверная часть будет оправлять уведомления на телефон.</li>
<li>Когда требуется отправить уведомление, серверная часть передаёт на ранее сохранённый URI сообщение определённого формата. Сервис уведомлений передаст данное сообщение на телефон в форме Toast уведомления, Live Tile обновления или просто данных приложению.</li>
</ul>
<p>Данная статья описывает то, как работают уведомления. Если Вы хотите увидеть пример того, как шаг за шагом реализовать уведомления в своём приложении, после прочтения данной статьи  откройте <a href="https://rusdpe.blob.core.windows.net/downloads/RusWP7TrainingKit.zip">Windows Phone Developer Training Kit</a> и выполните практическое занятие.</p>
<h3>Типы уведомлений.</h3>
<p>Я уже говорил, что существуют три типа уведомлений. Далее приведу их список с кратким описанием каждого типа:</p>
<ul>
<li><strong>Raw уведомления</strong> – этот тип уведомлений используется для отправки «сырых» данных приложению, когда само приложение запущено. Телефон никак не отображает данный тип уведомлений. Приложение просто получает данные от сервера.</li>
<li><strong>Toast уведомления</strong> –  в отличие от Row уведомлений, данный тип уведомлений будет получен, если Ваше приложение не запущено. Toast уведомления всплывают полоской в верхней части экрана. Но, если Toast уведомления будут всплывать слишком часто, это может начать раздражать пользователя. Данный тип уведомления не предназначен для отправки данных приложению, для этого Вам всё равно надо передавать Raw уведомления. При нажатии на Toast уведомление пользователь быстро переключится в Ваше приложение.</li>
<li><strong>Live Tile обновления</strong> – если Ваше приложение закреплено на стартовой странице телефона, Вы можете обновить Tile приложения (квадрат на стартовой странице). Можно обновить фон квадрата и/или добавить число от одного 0 до 99.</li>
</ul>
<h3>Получение URI от сервиса уведомлений.</h3>
<p>Для получения URI, который будет использовать серверная часть Вашего приложения при отправке уведомлений на телефон, достаточно написать всего около десяти строчек кода. В первую очередь подключите пространство имён «Microsoft.Phone.Notification». Далее создаётся объект класса «HttpNotificationChannel». В конструктор класса «HttpNotificationChannel» передаётся уникальное имя канала. Класс «HttpNotificationChannel» используется для взаимодействия с сервисом уведомлений (Push Notification service – PNS). Всё взаимодействие происходит в отдельном потоке, а для получения URI требуется подписаться на событие. В обработчике события мы уже можем получить URI. В примере ниже полученный URI выводится в окно «Output» в Visual Studio как отладочная информация. Отображать URI на экране не требуется, так как это глубоко внутренняя информация.</p>
<div style="overflow-x: scroll">
<pre>public partial class MainPage
{
    private readonly HttpNotificationChannel _channel;

    public MainPage()
    {
        InitializeComponent();

        _channel = new HttpNotificationChannel("pugachev.info" + DateTime.Now.Ticks);

        _channel.ChannelUriUpdated += ChannelChannelUriUpdated;
        _channel.ErrorOccurred += ChannelErrorOccurred;

        _channel.Open();
        _channel.BindToShellToast();
    }

    static void ChannelErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
    {
        Debug.WriteLine("An error occured while initializing the notification channel");
        Debug.WriteLine(e.Message);
    }

    static void ChannelChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
    {
        Debug.WriteLine(e.ChannelUri);
    }
}</pre>
</div>
<p>При выполнении данного примера кода я получил следующий URI (в вашем случае он, естественно будет другим):</p>
<p><em>http://db3.notify.live.net/throttledthirdparty/01.00/AHEHNbRDjdk3Rr6DCPlxYnbVAgAVAAADAQAAnAQUZm52OjIzOEQ1NDKDRkI5MEVFMEQ</em></p>
<p>Поле получения URI передайте его каким-то образом серверной части Вашего приложения.</p>
<h3>Отправка уведомления.</h3>
<p>Код отправки уведомления, приведённый ниже, выполняется на сервере. Мы будем отправлять Toast уведомление. При этом отправляется HTTP сообщение определённого формата на ранее полученный URI:</p>
<div style="overflow-x: scroll">
<pre>private static void SendToastNotification()
{
    var request = (HttpWebRequest)WebRequest.Create("http://db3.notify.live.net/throttledthirdparty/01.00/AAERNQbcM6D5TaCKRQDXVyGZAgAAAAADAQAAAAQUZm52OjIzOEQ2NDJDRkI5MEVFMEQ");
    request.Method = "POST";
    request.ContentType = "text/xml";
    request.Headers.Add("X-NotificationClass", "2");
    request.Headers.Add("X-WindowsPhone-Target", "toast");
    const string notificationData = "&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;" +
                                    "&lt;wp:Notification xmlns:wp=\"WPNotification\"&gt;" +
                                    "&lt;wp:Toast&gt;" +
                                    "&lt;wp:Text1&gt;45 дней c Windows Phone 7&lt;/wp:Text1&gt;" +
                                    "&lt;wp:Text2&gt;Уведомления&lt;/wp:Text2&gt;" +
                                    "&lt;/wp:Toast&gt;" +
                                    "&lt;/wp:Notification&gt;";

    var contents = Encoding.UTF8.GetBytes(notificationData);
    request.ContentLength = contents.Length;

    using (var requestStream = request.GetRequestStream())
    {
        requestStream.Write(contents, 0, contents.Length);
    }

    using (var response = (HttpWebResponse)request.GetResponse())
    {
        var notificationStatus = response.Headers["X-NotificationStatus"];
        var notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
        var deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];

        Console.WriteLine("Статус: {0}. Статус канала: {1}. Статус устройства: {2}.",
            notificationStatus,
            notificationChannelStatus,
            deviceConnectionStatus);
    }
}</pre>
</div>
<p>Как видите, код достаточно длинный. Но пример полностью показывает, как отправить уведомление. Попробуйте выполнить данный пример, и Вы увидите, каким мощным инструментом являются уведомления. С их помощью Ваше приложение может чаще оказаться перед глазами пользователя. </p>
<p><img src="http://pugachev.info/wp-content/uploads/2010/11/toast.png"/></p>
<p>Иконка на иллюстрации – это иконка приложения. Её достаточно легко поменять.</p>
<h3>Пример кода.</h3>
<p><iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-c78cd5219d383817.office.live.com/embedicon.aspx/.Public/20%20Push%20Notifications.zip"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/664/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>45 дней с Windows Phone 7. День #19. Элемент управления Map.</title>
		<link>http://pugachev.info/archives/640</link>
		<comments>http://pugachev.info/archives/640#comments</comments>
		<pubDate>Mon, 15 Nov 2010 21:14:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=640</guid>
		<description><![CDATA[&#60;&#60; День #18. элемент управления WebBrowser.&#124;&#160;День #20. Уведомления (Push Notifications) &#62;&#62; Это девятнадцатая статья серии «45 дней с Windows Phone 7». Вчера мы говорили про элемент управления «WebBrowser», с помощью которого можно отображать не только web сайты, но и произвольно сгенерированный HTML. Сегодня мы рассмотрим более специфический элемент управления, который позволяет показывать карту в Windows [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pugachev.info/archives/622">&lt;&lt;  День #18. элемент управления WebBrowser.</a>|&nbsp;<a href="http://pugachev.info/archives/664">День #20. Уведомления (Push Notifications) &gt;&gt;</a></p>
<p>Это девятнадцатая статья серии «<a href="http://pugachev.info/windowsphone7">45 дней с Windows Phone 7</a>».</p>
<p>Вчера мы говорили про элемент управления «WebBrowser», с помощью которого можно отображать не только web сайты, но и произвольно сгенерированный HTML. Сегодня мы рассмотрим более специфический элемент управления, который позволяет показывать карту в Windows Phone 7 Silverlight приложениях. Название данного элемента управления весьма логично, он называется «Map» – карта.</p>
<h3>Использование элемента управления «Map».</h3>
<p>Перетащите элемент управления Map из Toolbox на страницу Silverlight приложения. При этом подключится соответствующее XML пространство имён:</p>
<pre>xmlns:map="clr-namespace:Microsoft.Phone.Controls.Maps;
assembly=Microsoft.Phone.Controls.Maps"</pre>
<p>После того как я задал позиционирование и размеры для карты, XAML код элемента управления выглядит следующим образом:</p>
<pre>&lt;map:Map Height="607" HorizontalAlignment="Left"
Name="myMap" VerticalAlignment="Top" Width="456" /&gt;</pre>
<p>Запустим приложение и посмотрим на карту.</p>
<p><img src="http://www.jeffblankenburg.com/image.axd?picture=mapcontrolscreenshot.jpg" alt="" /></p>
<p>Посмотрев на иллюстрацию выше, Вы, наверное, хотите спросить меня про белую надпись посередине карты, с текстом: «Invalid Credentials.  Sign up for a developer account.». Если вкратце, нам нужен ключ API для работы с картой. Далее в статье я расскажу, как такой ключ получить (абсолютно бесплатно, надо заметить), а также мы рассмотрим множество других аспектов работы с картой.</p>
<h3>Регистрация аккаунта разработчика и получение ключа для работы с картой.</h3>
<p>Регистрация аккаунта разработчика и получение ключа для работы с картой.</p>
<p>Итак, зайдите на портал <a href="http://www.bingmapsportal.com/">Bing Maps</a> и зарегистрируйтесь. Поле регистрации создайте новый ключ API в разделе «Create or view keys». Форма создания нового ключа представлена на иллюстрации ниже.</p>
<p><img src="http://www.jeffblankenburg.com/image.axd?picture=createbingmapsapikey.png" alt="" /></p>
<p>В качестве «Application URL» можете ввести адрес Вашего web сайта. После заполнения формы Вы получите ключ, похожий на данный:</p>
<p><strong>AsWlUnHbvLgHlLHaRhTZLslewv1QIdGppxOqyL-6He2jxyHvLAjutrcntemUih-w9</strong></p>
<p>(Нет, это не мой ключ. Я заменил достаточно много знаков. Но показанный ключ похож на тот, что Вы получите).</p>
<h3>Задаём Credentials Provider.</h3>
<p>После того, как Вы получите ключ API, данный ключ надо задать в приложении. Если в Вашем приложении только одна карта, просто напишите ключ в свойстве «CredentialsProvider» элемента управления «Map».</p>
<pre>&lt;map:Map CredentialsProvider=
"AsWlUnHbvLgHlLHaRhTZLslewv1QIdGppxOqyL-6He2jxyHvLAjutrcntemUih-w9"/&gt;</pre>
<p>Но, если карт в приложении несколько, лучше использовать другой подход: определить ключ API один раз в файле App.xaml, а потом с помощью механизма связывания данных задать ключ для каждой карты. Далее приведу код, добавляемый в файл App.xaml при использовании данного подхода:</p>
<pre>&lt;Application.Resources&gt;
&lt;map:ApplicationIdCredentialsProvider ApplicationId=
"AsWlUnHbvLgHlLHaRhTZLslewv1QIdGppxOqyL-6He2jxyHvLAjutrcntemUih-w9"
x:Key="BingMapsAPIKey"/&gt;
&lt;/Application.Resources&gt;</pre>
<p>Теперь свойство «CredentialsProvider» у элемента управления Map измениться:</p>
<pre>&lt;map:Map CredentialsProvider="{StaticResource BingMapsAPIKey}"&gt;</pre>
<p>После задания «CredentialsProvider» запустите приложение. Белая надпись посреди карты должна исчезнуть.</p>
<h3>Добавляем точки(Pushpin) на карту.</h3>
<p>Мы можем добавить пользовательские точки на карту как с помощью C# кода, так и в XAML разметке. Для добавления точки требуется определить местоположение, а также содержимое, являющееся, по сути, подписью. Добавим точку в XAML разметке:</p>
<pre>&lt;map:Map CredentialsProvider=
"AsWlUnHEvLgHlLHaRqTZLslewv1QIdGppxOqyL-7He2jxyHvLAjutrcntemUih-w9"&gt;
&lt;map:Pushpin Location="40.1449, -82.9754" FontSize="30" 
Background="Orange" Content="1" /&gt;
&lt;/map:Map&gt;</pre>
<p>Аналогичный результат можно получить и с помощью C# кода:</p>
<pre>Pushpin pushpin = new Pushpin();
Location location = new Location();
location.Latitude = 40.1449;
location.Longitude = -82.9754;
pushpin.Location = location;
pushpin.Background = new SolidColorBrush(Colors.Orange);
pushpin.Content = "1";
pushpin.FontSize = 30;
MapControl.Children.Add(pushpin);</pre>
<p>На иллюстрации ниже показано, как только что добавленная нами точка выглядит на карте.<br />
<img src="http://www.jeffblankenburg.com/image.axd?picture=pushpin.jpg" alt="" /></p>
<p>Если Вам интересно как преобразовать какой-либо адрес в значение широты/долготы, прочтите <a href="http://www.jeffblankenburg.com/post/Day-31-Geocoding-and-More-Fun-In-Bing-Maps-for-Silverlight.aspx">соответствующую статью</a>. Данная статья описывает работу с картами в десктопном Silverlight, но актуальна и для работы с картами на телефоне.</p>
<h3>Добавляем на карту произвольные фигуры.</h3>
<p>Полезным классом при работе с картой является «MapPolygon». MapPolygon позволяет задать список координат, по которым на карте рисуется фигура. Данная фигура позиционируется в нужное место карты независимо от прокрутки и изменения масштаба карты. Координаты являются значениями широты/долготы, что позволяет обозначить на карте страны, регионы, места для парковки, да и вообще все, что может потребоваться обозначить в Вашем приложении. Далее я добавляю простую фигуру на карту:</p>
<p><strong>XAML</strong></p>
<pre>
&lt;map:MapPolygon Fill="Purple"
Stroke="White" Opacity=".7"
Locations="40.1449,-82.9754 40.1449,-12.9754 10.1449,-82.9754" /&gt;
</pre>
<p><strong>C#</strong></p>
<pre>
MapPolygon mapPolygon = new MapPolygon();
mapPolygon.Fill = new SolidColorBrush(Colors.Purple);
mapPolygon.Stroke = new SolidColorBrush(Colors.White);
mapPolygon.Opacity = .7;
LocationCollection locations = new LocationCollection();
Location location = new Location();
location.Latitude = 40.1449;
location.Longitude = -82.9754;
Location location1 = new Location();
location1.Latitude = 40.1449;
location1.Longitude = -12.9754;
Location location2 = new Location();
location1.Latitude = 10.1449;
location1.Longitude = -82.9754;
locations.Add(location);
locations.Add(location1);
locations.Add(location2);
mapPolygon.Locations = locations;
MapControl.Children.Add(mapPolygon);
</pre>
<p>Теперь на карте у нас есть точка и фигура. Как это выглядит показано на иллюстрации ниже.</p>
<p><img src="http://www.jeffblankenburg.com/image.axd?picture=mappolygon.jpg"/></p>
<p>Если Вам интересны другие возможности по работе с картой, обратите внимание на <a href="http://www.microsoft.com/maps/isdk/silverlight/default.htm">Bing Maps Silverlight Control Interactive SDK</a>. Там вы найдёте много полезной информации.</p>
<h3>Пример кода.</h3>
<p>Пример кода показывает, как добавить точку и фигуру на карту в XAML разметке и C# коде. Естественно применять два способа одновременно не нужно, выберете один и используйте его. </p>
<p><iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-c78cd5219d383817.office.live.com/embedicon.aspx/.Public/Day19-MapControl.zip"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/640/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>45 дней с Windows Phone 7. День #18. Элемент управления WebBrowser.</title>
		<link>http://pugachev.info/archives/622</link>
		<comments>http://pugachev.info/archives/622#comments</comments>
		<pubDate>Thu, 11 Nov 2010 07:35:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=622</guid>
		<description><![CDATA[&#60;&#60; День #17. Элемент управления Pivot.&#124;&#160;День #19. Элемент управления Map &#62;&#62; День #24. WebBrowser. Часть 2. Локальный контент. Это восемнадцатая статья серии «45 дней с Windows Phone 7». Что может делать элемент управления «WebBrowser»? Очевидно, что элемент управления WebBrowser служит для просмотра Web страниц. Но полноценным браузером данный элемент управления не является, так как у [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pugachev.info/archives/607">&lt;&lt;  День #17. Элемент управления Pivot.</a>|&nbsp;<a href="http://pugachev.info/archives/640">День #19. Элемент управления Map &gt;&gt;</a></p>
<p><a href="http://pugachev.info/archives/762">День #24. WebBrowser. Часть 2. Локальный контент.</a></p>
<p>Это восемнадцатая статья серии «<a href="http://pugachev.info/windowsphone7">45 дней с Windows Phone 7</a>».</p>
<h3>Что может делать элемент управления «WebBrowser»?</h3>
<p>Очевидно, что элемент управления WebBrowser служит для просмотра Web страниц.  Но полноценным браузером данный элемент управления не является, так как у него нет адресной строки, вкладок, различных диалогов и.т.д. Можно представить данный элемент управления как некий аналог «iframe» из HTML мира. Кроме того, элемент управления WebBrowser уже имеет встроенную поддержку мультитач жестов. Вам для этого делать ничего не требуется.</p>
<p>Важной особенностью элемента управления является то, что он поддерживает не только отображение сайтов, загружаемых из интернета, но и работу с локальным контентом. Вы можете напрямую задать HTML, который будет отображаться в WebBrowser. Можно сохранить нужные страницы в ресурсах приложения, либо даже генерировать HTML налету.</p>
<p>Вообще говоря, добавить WebBrowser в Silverlight Windows Phone 7 приложение просто. Надо только перетащить данный элемент управления из Toolbox:</p>
<pre>&lt;phone:WebBrowser x:Name="wbMain"/&gt;</pre>
<p>При этом будет подключено соответствующее XML пространство имён:</p>
<pre>xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"</pre>
<p>Для того чтобы в браузере отобразить страницу, достаточно вызвать один метод:</p>
<pre>
wbMain.Navigate(new Uri("http://pugachev.info"));
</pre>
<p>Я также заменил заголовок страницы Silverlight приложения и название самого приложения. Результат показан на иллюстрации ниже.</p>
<p><img src="http://pugachev.info/wp-content/uploads/2010/11/Untitled.jpg"/></p>
<p>Важно отметить, что элемент управления WebBrowser в Windows Phone 7, в отличие от своего аналога в десктопном Silverlight не нуждается в HtmlBrush, так как большинство графических преобразований можно сделать над самим браузером. Например, повернём WebBrowser на 45 градусов по оси Y:</p>
<pre>&lt;phone:WebBrowser x:Name="wbMain"&gt;
    &lt;phone:WebBrowser.Projection&gt;
        &lt;PlaneProjection RotationY="-45"/&gt;
    &lt;/phone:WebBrowser.Projection&gt;
&lt;/phone:WebBrowser&gt;</pre>
<p>Вот как это будет выглядеть:</p>
<p><img src="http://pugachev.info/wp-content/uploads/2010/11/Untitled2.jpg" alt="" /></p>
<p>При этом элемент управления WebBrowser полностью интерактивен и продолжает работать как обычно. Во внебраузерном Silverlight 4 приложении мы такое бы сделать не смогли.</p>
<h3>Загрузка локального контента.</h3>
<p>Давайте добавим в наш проект несколько HTML страниц. В целях демонстрации я добавил две, но их может быть сколько угодно, однако не стоит забывать и об итоговом размере получившегося приложения.</p>
<p>Давайте теперь загрузим в браузере какую-либо страницу. Загрузка страниц будет происходить в том числе с помощью классов из XNA Framework, поэтому добавим в раздел «References» проекта нашего приложения библиотеку «Microsoft.Xna.Framework.dll». Классы из XNA часто помогают упростить разработку не только игр, но и обычных Silverlight Windows Phone 7 приложений.</p>
<p>Итак, в начале мы прочитаем нужную страницу с помощью StreamReader, а после этого вызовем у WebBrowser метод «NavigateToString»:</p>
<pre>StreamReader reader = new StreamReader(TitleContainer.OpenStream("html/wp7wiki.html"));
wbMain.NavigateToString(reader.ReadToEnd());</pre>
<p>Класс <a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.titlecontainer_members.aspx">«TitleContainer»</a> находится в пространстве имён «Microsoft.Xna.Framework». Если Вы хотите узнать больше про «Microsoft.Xna.Framework», прочитайте соответствующую <a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.aspx">статью на MSDN</a>.</p>
<p><img src="http://www.jeffblankenburg.com/image.axd?picture=addhtmlfiles.png" alt="" /></p>
<p>Кроме загрузки уже существующей страницы, мы можем генерировать HTML прямо в коде приложения. Далее приведу пример того, как это можно сделать:</p>
<pre>string html = "&lt;h1 style=\"color:red;\"&gt;Привет!&lt;/h1&gt;" +
"&lt;a href=\"http://pugachev.info\"&gt;Блог Сергея Пугачёва&lt;/a&gt;";
wbMain.NavigateToString(ConvertExtendedAscii(html));</pre>
<p>Функция «ConvertExtendedAscii» используется для устранения возможных проблем с кодировкой.</p>
<pre>public static string ConvertExtendedAscii(string html)
{
    var retVal = "";
    var s = html.ToCharArray();

    foreach (char c in s)
    {
        if (Convert.ToInt32(c) &gt; 127)
            retVal += "&amp;#" + Convert.ToInt32(c) + ";";
        else
            retVal += c;
    }

    return retVal;
}</pre>
<p><img src="http://pugachev.info/wp-content/uploads/2010/11/Untitled3.jpg" alt="" /></p>
<h3>JavaScript по умолчанию отключён.</h3>
<p>Если на Ваших страницах есть JavaScript, то просто так он работать не будет. Его поддержку надо включить явно. Сделать это очень просто, достаточно задать значение свойства «IsScriptEnabled»:</p>
<pre>&lt;phone:WebBrowser x:Name="wbMain" IsScriptEnabled="True"/&gt;</pre>
<h3>Взаимодействие со страницами, загруженными в WebBrowser.</h3>
<p>При взаимодействии со страницей, загруженной в WebBrowser мы можем вызывать из C# кода JavaScript функции, а из JavaScript уведомлять Silverlight приложение. Вызвать JavaScript функцию  из C# можно с помощью «.InvokeScript()». В данном примере мы вызываем функцию «functionName» с параметром «parametr1»  и получаем возвращаемое значение:</p>
<pre>string returnValue = (string)wbMain.InvokeScript("functionName", "parametr1");</pre>
<p>Для оповещения Silverlight приложения из JavaScript в Silverlight приложении надо подписаться на событие «ScriptNotify» элемента управления браузера. В обработчике события можно получить параметр, переданный из JavaScript:</p>
<pre>void wbMain_ScriptNotify(object sender, NotifyEventArgs e)
{
    var value = e.Value;
}</pre>
<p>В JavaScript для вызова оповещения надо сделать следующее:</p>
<pre>window.external.Notify("value");</pre>
<p>В данном примере мы передаём Silverlight приложению параметр со значением «value».</p>
<p>Так как взаимодействовать с JavaScript не имеет смысла до загрузки страницы,  мы можем отслеживать процесс загрузки с помощью двух событий элемента управления «WebBrowser»:  «Navigating» и «Navigated». Например, во время загрузки, чтобы не смущать пользователя белым экраном, можно показывать ProgressBar:</p>
<pre>
&lt;ProgressBar Foreground="Orange" x:Name="ProgBar"
Visibility="Collapsed" IsIndeterminate="True" Height="4"
HorizontalAlignment="Left" Margin="10,66,0,0"
VerticalAlignment="Top" Width="460" /&gt;

void Browser_Navigating(object sender, NavigatingEventArgs e)
{
    ProgBar.Visibility = Visibility.Visible;
}

void Browser_Navigated(object sender, NavigationEventArgs e)
{
    ProgBar.Visibility = Visibility.Collapsed;
}
</pre>
<p>Соответственно, когда страница загружается, ProgressBar будет виден, а после загрузки страницы он будет скрыт.</p>
<h3>Пример кода.</h3>
<p>Пример кода демонстрирует достаточно законченное приложение. Попробуйте на реальном примере то, о чём мы говорили сегодня.</p>
<p><iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-c78cd5219d383817.office.live.com/embedicon.aspx/.Public/Day18-WebBrowserControl.zip"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/622/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>45 дней с Windows Phone 7. День #17. Элемент управления Pivot.</title>
		<link>http://pugachev.info/archives/607</link>
		<comments>http://pugachev.info/archives/607#comments</comments>
		<pubDate>Tue, 09 Nov 2010 12:33:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=607</guid>
		<description><![CDATA[&#60;&#60; День #16. Элемент управления Panorama.&#124;&#160;День #18. Элемент управления WebBrowser &#62;&#62; Это семнадцатая статья серии «45 дней с Windows Phone 7». Вчера мы говорили о том, для чего служит и как используется элемент управления «Panorama». Сегодня мы рассмотрим похожий, но всё-таки другой элемент управления, который часто путают с «Panorama» и который называется «Pivot». Элемент управления [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pugachev.info/archives/586">&lt;&lt;  День #16. Элемент управления Panorama.</a>|&nbsp;<a href="http://pugachev.info/archives/622">День #18. Элемент управления WebBrowser &gt;&gt;</a></p>
<p>Это семнадцатая статья серии «<a href="http://pugachev.info/windowsphone7">45 дней с Windows Phone 7</a>».</p>
<p>Вчера мы говорили о том, для чего служит и как используется элемент управления «Panorama». Сегодня мы рассмотрим похожий, но всё-таки другой элемент управления, который часто путают с «Panorama» и который называется «Pivot».</p>
<h3>Элемент управления «Pivot».</h3>
<p>Pivot представляет собой элемент управления для создания своеобразных табов. Данный сценарий применяется в окне настроек телефона для переключения между настройками самого телефона и настройками приложений. Рассмотрим другое приложение на телефоне. Например, в календаре можно переключиться из режима «day» в режим «agenda». Данные режимы позволяют посмотреть на одни и те же данные как бы с различных сторон.  Это также частый сценарий применения элемента управления «Pivot». Можно сказать даже основной сценарий. Далее приведены иллюстрации того, как всё это выглядит.</p>
<p><img src="http://pugachev.info/wp-content/uploads/2010/11/calendar.jpg" alt="" /></p>
<h3>Когда следует использовать элемент управления «Panorama», а когда «Pivot».</h3>
<p>Tim Heuer написал <a href="http://timheuer.com/blog/archive/2010/08/13/windows-phone-panorama-versus-pivot-ux-guidelines.aspx">прекрасную статью</a> о том, когда что стоит использовать. Вы также можете посмотреть <a href="http://channel9.msdn.com/blogs/jaime+rodriguez/windows-phone-design-days-pivot-and-pano">видео на Channel 9</a>.</p>
<p>Мои советы достаточно просты:</p>
<ul>
<li>Используйте элемент управления Panorama для Вашего приложения, кода оно представляется хабом (некой длинной лентой, которую пользователю будет интересно прокучивать), и нет необходимости в панели приложения.</li>
<li>Используйте элемент управления Pivot, когда Вам надо показать одни и те же или связанные данные с различных сторон. Как бы расплывчато это не звучало.</li>
</ul>
<h3>Использование элемента управления «Pivot».</h3>
<p>Если Вы не читали вчерашнюю <a href="http://pugachev.info/archives/586">статью про элемент управления Panorama</a>, прочтите её. Там описывалось, как добавить Panorama и Pivot на Toolbox в Visual Studio. Вообще, использование Pivot очень похоже на использование Panorama и далее мы рассмотрим использование Pivot на конкретных примерах. В сегодняшнем примере мы будем применять связывание данных (Data Binding) и шаблоны данных (Data Templates) для отображения списка имён в приложении, используемом для подбора имени ребёнка. В трёх вкладках элемента управления Pivot можно будет посмотреть на имена (данные) с различных сторон: имена для мальчиков и девочек, мужские и женские имена по отдельности соответственно. Создадим три вкладки:</p>
<pre>&lt;controls:Pivot Title="BABY NAMES"&gt;
    &lt;controls:PivotItem Header="boys"&gt;

    &lt;/controls:PivotItem&gt;
    &lt;controls:PivotItem Header="girls"&gt;

    &lt;/controls:PivotItem&gt;
    &lt;controls:PivotItem Header="either"&gt;

    &lt;/controls:PivotItem&gt;
&lt;/controls:Pivot&gt;</pre>
<p>Но пустые вкладки мало чем могут помочь, давайте двигаться дальше.</p>
<h3>Добавляем данные.</h3>
<p>На каждую вкладку мы добавим элемент управления ListBox, у которого будет задан шаблон элемента (ItemTemplate). Далее приведён полный получившийся XAML код:</p>
<div style="overflow-x: scroll">
<pre>&lt;controls:Pivot Title="BABY NAMES"&gt;
    &lt;controls:PivotItem Header="boys"&gt;
        &lt;ListBox x:Name="boyList" Margin="0,0,-12,0"&gt;
            &lt;ListBox.ItemTemplate&gt;
                &lt;DataTemplate&gt;
                    &lt;StackPanel Margin="0,0,0,17" &gt;
                        &lt;TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/&gt;
                    &lt;/StackPanel&gt;
                &lt;/DataTemplate&gt;
            &lt;/ListBox.ItemTemplate&gt;
        &lt;/ListBox&gt;
    &lt;/controls:PivotItem&gt;
    &lt;controls:PivotItem Header="girls"&gt;
        &lt;ListBox x:Name="girlList" Margin="0,0,-12,0"&gt;
            &lt;ListBox.ItemTemplate&gt;
                &lt;DataTemplate&gt;
                    &lt;StackPanel Margin="0,0,0,17" &gt;
                        &lt;TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/&gt;
                    &lt;/StackPanel&gt;
                &lt;/DataTemplate&gt;
            &lt;/ListBox.ItemTemplate&gt;
        &lt;/ListBox&gt;
    &lt;/controls:PivotItem&gt;
    &lt;controls:PivotItem Header="either"&gt;
        &lt;ListBox x:Name="allList" Margin="0,0,-12,0"&gt;
            &lt;ListBox.ItemTemplate&gt;
                &lt;DataTemplate&gt;
                    &lt;StackPanel Margin="0,0,0,17" &gt;
                        &lt;TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/&gt;
                    &lt;/StackPanel&gt;
                &lt;/DataTemplate&gt;
            &lt;/ListBox.ItemTemplate&gt;
        &lt;/ListBox&gt;
    &lt;/controls:PivotItem&gt;
&lt;/controls:Pivot&gt;</pre>
</div>
<p>Теперь воспользуемся связыванием данных и определим то, что будет отображаться. Сделаем это в C# коде. Сейчас  я не буду подробно рассказывать про связывание данных, так как на эту тему уже написано достаточно. Знание данной темы необходимо любому Silverlight/WPF разработчику, поэтому я предполагаю, что со связыванием данных Вы знакомы.</p>
<div style="overflow-x: scroll">
<pre>namespace Day17_PivotControl
{
    public partial class MainPage : PhoneApplicationPage
    {
        BabyName[] names = new BabyName[10] {new BabyName("Steve", 1, 0),
					new BabyName("Jennifer", 2, 0),
					new BabyName("Alex", 1, 2),
					new BabyName("Casey", 1, 2),
					new BabyName("Quinn", 1, 2),
					new BabyName("Anthony", 1, 0),
					new BabyName("Sarah", 2, 0),
					new BabyName("Parker", 2, 1),
					new BabyName("Jessica", 2, 0),
					new BabyName("Jeff", 1, 0)};

        // Constructor
        public MainPage()
        {
            InitializeComponent();
            boyList.ItemsSource = from n in names
                                  where (n.Gender1 == 1 || n.Gender2 == 1)
                                  orderby n.Name
                                  select new BabyName(n.Name, n.Gender1, n.Gender2);

            girlList.ItemsSource = from n in names
                                   where (n.Gender1 == 2 || n.Gender2 == 2)
                                   orderby n.Name
                                   select new BabyName(n.Name, n.Gender1, n.Gender2);

            allList.ItemsSource = from n in names
                                  orderby n.Name
                                  select new BabyName(n.Name, n.Gender1, n.Gender2);
        }
    }
}
</pre>
</div>
<p>Скачать исходный код класса «BabyName» можно в разделе «Пример кода».</p>
<p>В данном примере для каждой вкладки мы определяем своё представление начальных данных. В этом конкретном случае посредством фильтрации.</p>
<p><img src="http://pugachev.info/wp-content/uploads/2010/11/pivot.jpg"/></p>
<p>Хочется отметить, что в 99.99% не стоит использовать в приложении больше семи (7) вкладок/секций для элементов управления Pivot и Panorama. В первую очередь, потому, что пользователи больше просто не запомнят. А если они это не запомнят, как они будут это использовать? Семь плюс-минус два – это хорошо известный предел кратковременной памяти человека. В основном, поэтому телефонные номера редко бывают длиннее семи цифр. Вообще говоря, для большинства приложений не стоит делать даже больше пяти вкладок/секций.</p>
<h3>Пример кода.</h3>
<p>В данной статье приведён простой пример использования элемента управления Pivot в Silverlight приложениях для Windows Phone 7. Скачайте пример и попробуйте элемент управления в действии.</p>
<p><iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-c78cd5219d383817.office.live.com/embedicon.aspx/.Public/Day17-PivotControl.zip"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/607/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

