<?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 4</title>
	<atom:link href="http://pugachev.info/archives/tag/silverlight-4/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>Web аналитика в Silverlight 4 приложениях</title>
		<link>http://pugachev.info/archives/513</link>
		<comments>http://pugachev.info/archives/513#comments</comments>
		<pubDate>Mon, 25 Oct 2010 20:48:15 +0000</pubDate>
		<dc:creator>spugachev</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Silverlight 4]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=513</guid>
		<description><![CDATA[В докладе рассматривается Silverlight Analytics Framework. Описывается, как добавить поддержку web аналитики в Silverlight приложения. Практическим примером является взаимодействие Silverlight приложения с сервисом Google Analytics. Также рассказывается, как создавать свои собственные провайдеры аналитики. Смотреть доклад]]></description>
			<content:encoded><![CDATA[<p>В докладе рассматривается Silverlight Analytics Framework. Описывается, как добавить поддержку web аналитики в Silverlight приложения. Практическим примером является взаимодействие Silverlight приложения с сервисом Google Analytics. Также рассказывается, как создавать свои собственные провайдеры аналитики.</p>
<h3><a href="http://www.techdays.ru/videos/2972.html">Смотреть доклад</a></h3>
<p></p>
<p><a href="http://www.techdays.ru/videos/2972.html"><img src="http://pugachev.info/wp-content/uploads/2010/10/analytics.jpg"/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/513/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Новые доклады про Silverlight на сайте TechDays.ru</title>
		<link>http://pugachev.info/archives/231</link>
		<comments>http://pugachev.info/archives/231#comments</comments>
		<pubDate>Mon, 17 May 2010 10:40:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Silverlight 4]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=231</guid>
		<description><![CDATA[На сайте TechDays.ru опубликованы ряд докладов, подготовленных в рамках проведения конференции ReMIX10. Доклады можно найти по адресу http://www.techdays.ru/Remix. Среди данных докладов есть и 5 моих: Silverlight 4. Создание внебраузерных приложений. Silverlight 4. Использование COM объектов в доверенных внебраузерных приложениях Silverlight 4. Стилизация окон внебраузерных приложений Silverlight 4. Доступ к локальной файловой системе Silverlight 4. Сетевые [...]]]></description>
			<content:encoded><![CDATA[<p>На сайте <a rel="nofollow" href="http://techdays.ru">TechDays.ru</a> опубликованы ряд докладов, подготовленных в рамках проведения конференции <a rel="nofollow" href="http://remix.ru/">ReMIX10</a>. Доклады можно найти по адресу <a rel="nofollow" href="http://www.techdays.ru/">http://www.techdays.ru/Remix</a>.</p>
<p>Среди данных докладов есть и 5 моих:<a rel="nofollow" href="http://www.techdays.ru/videos/2619.html"></p>
<h3>Silverlight 4. Создание внебраузерных приложений.</h3>
<p><img src="http://gotdotnet.ru/upload/blog/wizardbox/60c/01.jpg" border="0" alt="" /></a><a rel="nofollow" href="http://www.techdays.ru/videos/2658.html"></p>
<h3>Silverlight 4. Использование COM объектов в доверенных внебраузерных приложениях</h3>
<p><img src="http://gotdotnet.ru/upload/blog/wizardbox/806/02.jpg" border="0" alt="" /></a><a rel="nofollow" href="http://www.techdays.ru/videos/2661.html"></p>
<h3>Silverlight 4. Стилизация окон внебраузерных приложений</h3>
<p><img src="http://gotdotnet.ru/upload/blog/wizardbox/0c3/03.jpg" border="0" alt="" /><br />
</a><br />
<a rel="nofollow" href="http://www.techdays.ru/videos/2659.html"></p>
<h3>Silverlight 4. Доступ к локальной файловой системе</h3>
<p><img src="http://gotdotnet.ru/upload/blog/wizardbox/98a/04.jpg" border="0" alt="" /></a><a rel="nofollow" href="http://www.techdays.ru/videos/2660.html"></p>
<h3>Silverlight 4. Сетевые возможности доверенных внебраузерных приложений</h3>
<p><img src="http://gotdotnet.ru/upload/blog/wizardbox/e81/05.jpg" border="0" alt="" /></p>
<hr />Кроме того другие авторы представили ряд докладов: </a><a rel="nofollow" href="http://www.techdays.ru/videos/2541.html"></p>
<h3>Прототипирование интерактивного баннера в Expression Blend + SketchFlow</h3>
<p></a><br />
от <a rel="nofollow" href="http://www.techdays.ru/speaker/Kichinskij_Konstantin.html">Константина Кичинского</a> <a rel="nofollow" href="http://www.techdays.ru/videos/2634.html"></p>
<h3>Прототипирование Silverlight-приложений с помощью Expression SketchFlow: часть 2.</h3>
<p></a><br />
от прекрасной <a rel="nofollow" href="http://www.techdays.ru/speaker/Kosinskaya_Alena.html">Алены Косинской </a></p>
<hr /><a rel="nofollow" href="http://www.techdays.ru/videos/2667.html"></p>
<h3>Silverlight for Windows Embedded &#8211; современные технологии в разработке интерфейсов устройств</h3>
<p></a><br />
от <a rel="nofollow" href="http://www.techdays.ru/speaker/Belevskij_Pavel.html">Павела Белевского</a></p>
<hr /><a rel="nofollow" href="http://www.techdays.ru/videos/2627.html"></p>
<h3>Введение в Windows Phone 7</h3>
<p></a><br />
от <a rel="nofollow" href="http://www.techdays.ru/speaker/Lutaj_Sergej.html">Сергея Лутая</a> <a rel="nofollow" href="http://www.techdays.ru/videos/2656.html"></p>
<h3>Архитектура платформы Windows Phone 7</h3>
<p></a><br />
от <a rel="nofollow" href="http://www.techdays.ru/speaker/Lutaj_Sergej.html">Сергея Лутая</a> <a rel="nofollow" href="http://www.techdays.ru/videos/2668.html"></p>
<h3>Производительность Silverlight приложений на платформе Windows Phone 7</h3>
<p></a><br />
от <a rel="nofollow" href="http://www.techdays.ru/speaker/Lutaj_Sergej.html">Сергея Лутая</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/231/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Новый доклад на TechDays: «Работа с текстом и печать в Silverlight 4»</title>
		<link>http://pugachev.info/archives/168</link>
		<comments>http://pugachev.info/archives/168#comments</comments>
		<pubDate>Thu, 21 Jan 2010 09:39:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Silverlight 4]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=168</guid>
		<description><![CDATA[Доклад посвящён работе с элементом управления RichTextArea, форматированию текста, работе с буфером обмена и печати из Silverlight приложений. http://www.techdays.ru/videos/2198.html]]></description>
			<content:encoded><![CDATA[<p>Доклад посвящён работе с элементом управления RichTextArea, форматированию текста, работе с буфером обмена и печати из Silverlight приложений.</p>
<p><a href="http://www.techdays.ru/videos/2198.html">http://www.techdays.ru/videos/2198.html</a></p>
<p><a href="http://www.techdays.ru/videos/2198.html"><img src="http://pics.livejournal.com/spugachev/pic/0001241w" border='0'/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/168/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Text Trimming или обрезание текста в Silverlight 4</title>
		<link>http://pugachev.info/archives/133</link>
		<comments>http://pugachev.info/archives/133#comments</comments>
		<pubDate>Thu, 03 Dec 2009 20:41:00 +0000</pubDate>
		<dc:creator>spugachev</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Silverlight 4]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=133</guid>
		<description><![CDATA[Ещё одна возможность, доступная ранее только в WPF, теперь появилась и в Silverlight 4. Я имею в виду обрезание текста или Text Trimming. Часто бывает, что у нас есть ограниченная область для текста, без возможности прокрутки. Если текст в данную область не помещается, то он обрезается, но выглядит это не очень красиво, так как текст [...]]]></description>
			<content:encoded><![CDATA[<p>Ещё одна возможность, доступная ранее только в WPF, теперь появилась и в Silverlight 4. Я имею в виду обрезание текста или Text Trimming. </p>
<p>Часто бывает, что у нас есть ограниченная область для текста, без возможности прокрутки. Если текст в данную область не помещается, то он обрезается, но выглядит это не очень красиво, так как текст может обрезаться, например, посередине буквы.</p>
<p><img src="http://pics.livejournal.com/spugachev/pic/0000twzd" border='0'/></p>
<p>Вместо этого хочется, чтобы отображалась только та часть текста, которая помещается на экране и многоточие «…», говорящее о том, что не весь текст отображён. Раньше достичь такого поведения было трудно, требовалось делать много работы вручную. Теперь же у элемента управления TextBlock есть свойство TextTrimming, которое надо установить в значение «WordEllipsis»:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">&#60;</font><font color="#800000">TextBlock</font> <font color="#ff0000">Text</font><font color="#0000ff">="Длинный текст о чём-то важном"</font><br />
&nbsp; <font color="#ff0000">Width</font><font color="#0000ff">="160"</font> <font color="#ff0000">TextTrimming</font><font color="#0000ff">="WordEllipsis"</font><font color="#0000ff">&#62;</font><br />
<font color="#0000ff">&#60;/</font><font color="#800000">TextBlock</font><font color="#0000ff">&#62;</font></p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Выглядеть текст будет следующим образом:</p>
<p><img src="http://pics.livejournal.com/spugachev/pic/0000wptr" border='0'/></p>
<p>И даже, если мы увеличим размер шрифта, всё будет работать корректно:</p>
<p><img src="http://pics.livejournal.com/spugachev/pic/0000xgbb" border='0'/><br />
<span id="more-133"></span><br />
Теперь представьте, что Вы работаете с DataGrid. Вот так выглядит типичный DataGrid c длинными текстовыми данными без TextTrimming:</p>
<p><img src="http://pics.livejournal.com/spugachev/pic/00011ykr" border='0'/></p>
<p>А теперь добавим TextTrimming:</p>
<p><img src="http://pics.livejournal.com/spugachev/pic/000101cp" border='0'/></p>
<p>Приведу описание колонок для данного DataGrid:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">&#60;</font><font color="#800000">data:DataGrid</font> <font color="#ff0000">AutoGenerateColumns</font><font color="#0000ff">="False"</font> <font color="#ff0000">ItemsSource</font><font color="#0000ff">="{Binding Collection}"</font> <font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">data:DataGrid.Columns</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font class="rem">&#60;!--Id Column--&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">data:DataGridTextColumn</font> <font color="#ff0000">Binding</font><font color="#0000ff">="{Binding Id}"</font> <font color="#ff0000">Header</font><font color="#0000ff">="Id"</font> <font color="#ff0000">Width</font><font color="#0000ff">="35"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font class="rem">&#60;!--Name Column--&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">data:DataGridTemplateColumn</font> <font color="#ff0000">Header</font><font color="#0000ff">="Name"</font> <font color="#ff0000">Width</font><font color="#0000ff">="100"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">data:DataGridTemplateColumn.CellTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">DataTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">TextBlock</font> <font color="#ff0000">Text</font><font color="#0000ff">="{Binding Name}"</font> <font color="#ff0000">TextTrimming</font><font color="#0000ff">="WordEllipsis"</font><font color="#0000ff">&#62;&#60;/</font><font color="#800000">TextBlock</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">DataTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">data:DataGridTemplateColumn.CellTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">data:DataGridTemplateColumn</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font class="rem">&#60;!--Description Column--&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">data:DataGridTemplateColumn</font> <font color="#ff0000">Header</font><font color="#0000ff">="Description"</font> <font color="#ff0000">Width</font><font color="#0000ff">="*"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">data:DataGridTemplateColumn.CellTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">DataTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">TextBlock</font> <font color="#ff0000">Text</font><font color="#0000ff">="{Binding Description}"</font> <font color="#ff0000">TextTrimming</font><font color="#0000ff">="WordEllipsis"</font><font color="#0000ff">&#62;&#60;/</font><font color="#800000">TextBlock</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">DataTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">data:DataGridTemplateColumn.CellTemplate</font><font color="#0000ff">&#62;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">data:DataGridTemplateColumn</font><font color="#0000ff">&#62;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">data:DataGrid.Columns</font><font color="#0000ff">&#62;</font><br />
<font color="#0000ff">&#60;/</font><font color="#800000">data:DataGrid</font><font color="#0000ff">&#62;</font></p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Источник: <a href="http://weblogs.asp.net/lduveau/archive/2009/11/25/silverlight-4-text-trimming.aspx">Silverlight 4 Text Trimming</a> [en]</p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/133/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Использование CompositeTransform в Silverlight 4</title>
		<link>http://pugachev.info/archives/102</link>
		<comments>http://pugachev.info/archives/102#comments</comments>
		<pubDate>Wed, 25 Nov 2009 16:46:35 +0000</pubDate>
		<dc:creator>spugachev</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Silverlight 4]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=102</guid>
		<description><![CDATA[В Silverlight 4 кроме большого числа основополагающих улучеший, появилось много маленьких и незаметных новых возможностей, о которых часто не говорят, но, которые, бывают очень полезны. Одну такую новую возможность мы сегодня и рассмотрим. Говорю я про новый класс трансформаций, а именно про составную трансформацию – CompositeTransform. Раньше, если мы хотели, скажем, повернуть визуальный элемент на [...]]]></description>
			<content:encoded><![CDATA[<p>В Silverlight 4 кроме большого числа основополагающих улучеший, появилось много маленьких и незаметных новых возможностей, о которых часто не говорят, но, которые, бывают очень полезны. Одну такую новую возможность мы сегодня и рассмотрим. Говорю я про новый класс трансформаций, а именно про составную трансформацию – <a href="http://msdn.microsoft.com/en-us/library/system.windows.media.compositetransform(VS.96).aspx">CompositeTransform</a>. </p>
<p><img src="http://pics.livejournal.com/spugachev/pic/0000sar4" border='0'/></p>
<p>Раньше, если мы хотели, скажем, повернуть визуальный элемент на X градусов, наклонить и масштабировать его, нам требовалось объявлять группу трансформаций и задавать каждую трансформацию отдельно. Кроме всего прочего это налагало трудности при создании анимаций, так как приходилось задавать для каждой трансформации имя или обращаться к ней по индексу. Код, задающий несколько трансформаций, выглядел примерно так:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">&#60;</font><font color="#800000">Button</font> <font color="#ff0000">Content</font><font color="#0000ff">="TransformGroup"</font> <font color="#ff0000">Width</font><font color="#0000ff">="150"</font> <font color="#ff0000">Height</font><font color="#0000ff">="50"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">Button.RenderTransform</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">TransformGroup</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">ScaleTransform</font> <font color="#ff0000">ScaleX</font><font color="#0000ff">="1.2"</font> <font color="#ff0000">ScaleY</font><font color="#0000ff">="1.5"</font> <font color="#ff0000">CenterX</font><font color="#0000ff">="75"</font> <font color="#ff0000">CenterY</font><font color="#0000ff">="25"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">SkewTransform</font> <font color="#ff0000">AngleX</font><font color="#0000ff">="-10"</font> <font color="#ff0000">AngleY</font><font color="#0000ff">="-5"</font> <font color="#ff0000">CenterX</font><font color="#0000ff">="75"</font> <font color="#ff0000">CenterY</font><font color="#0000ff">="25"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">RotateTransform</font> <font color="#ff0000">Angle</font><font color="#0000ff">="-10"</font> <font color="#ff0000">CenterX</font><font color="#0000ff">="75"</font> <font color="#ff0000">CenterY</font><font color="#0000ff">="25"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">TransformGroup</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">Button.RenderTransform</font><font color="#0000ff">&#62;</font><br />
<font color="#0000ff">&#60;/</font><font color="#800000">Button</font><font color="#0000ff">&#62;</font></p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p><span id="more-102"></span><br />
Теперь же, в случае использования CompositeTransform мы можем объявить одну трансформацию вместо группы.  При этом визуально результат будет аналогичным, но мы пишем более чистый и компактный код:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">&#60;</font><font color="#800000">Button</font> <font color="#ff0000">Content</font><font color="#0000ff">="CompositeTransform"</font> <font color="#ff0000">Width</font><font color="#0000ff">="150"</font> <font color="#ff0000">Height</font><font color="#0000ff">="50"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">Button.RenderTransform</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">CompositeTransform</font>&nbsp;<font color="#ff0000">CenterX</font><font color="#0000ff">="75"</font> <font color="#ff0000">CenterY</font><font color="#0000ff">="25"</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">ScaleX</font><font color="#0000ff">="1.2"</font> <font color="#ff0000">ScaleY</font><font color="#0000ff">="1.5"</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">SkewX</font><font color="#0000ff">="-10"</font> <font color="#ff0000">SkewY</font><font color="#0000ff">="-5"</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">Rotation</font><font color="#0000ff">="-10"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">Button.RenderTransform</font><font color="#0000ff">&#62;</font><br />
<font color="#0000ff">&#60;/</font><font color="#800000">Button</font><font color="#0000ff">&#62;</font></p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Разница в коде ещё более заметна, если мы задаём трансформации используя, скажем, язык C#:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black">TransformGroup tg = </font><font color="#0000ff">new</font> TransformGroup();</p>
<p>ScaleTransform scale = <font color="#0000ff">new</font> ScaleTransform();<br />
scale.ScaleX = 1.2;<br />
scale.ScaleY = 1.5;<br />
scale.CenterX = 75;<br />
scale.CenterY = 25;<br />
tg.Children.Add(scale);</p>
<p>SkewTransform skew = <font color="#0000ff">new</font> SkewTransform();<br />
skew.AngleX = -10;<br />
skew.AngleY = -5;<br />
skew.CenterX = 75;<br />
skew.CenterY = 25;<br />
tg.Children.Add(skew);</p>
<p>RotateTransform rotate = <font color="#0000ff">new</font> RotateTransform();<br />
rotate.Angle = -10;<br />
rotate.CenterX = 75;<br />
rotate.CenterY = 25;<br />
tg.Children.Add(rotate);</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Тот же пример, но с использованием CompositeTransform:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black">CompositeTransform ct = </font><font color="#0000ff">new</font> CompositeTransform();<br />
ct.ScaleX = 1.5;<br />
ct.ScaleY = 1.5;<br />
ct.SkewX = -10;<br />
ct.SkewY = -5;<br />
ct.Rotation = -10;<br />
ct.CenterX = 75;<br />
ct.CenterY = 25;</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>По мотивам  <a href="http://adamkinney.wordpress.com/2009/11/22/compositetransform-simplifies-transforms-in-silverlight-4-beta/">CompositeTransform simplifies transforms in Silverlight 4 Beta</a> [en]</p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/102/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Работа с веб камерой и микрофоном в Silverlight 4</title>
		<link>http://pugachev.info/archives/99</link>
		<comments>http://pugachev.info/archives/99#comments</comments>
		<pubDate>Thu, 19 Nov 2009 11:06:09 +0000</pubDate>
		<dc:creator>spugachev</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Silverlight 4]]></category>

		<guid isPermaLink="false">http://pugachev.info/?p=99</guid>
		<description><![CDATA[Введение То, что многие Сильверлайт разработчики давно ждали, произошло. Четвёртый Сильверлайт позволяет получить доступ к веб камере и микрофону. И пусть это не является революцией, в отличие от многих других новых возможностей (конкурирующие технологии поддерживали камеру и микрофон уже давно), но мощь, простота и удобство нового API заслуживают того, чтобы на эту часть функциональности четвёртого [...]]]></description>
			<content:encoded><![CDATA[<h1>Введение</h1>
<p>То, что многие Сильверлайт разработчики давно ждали, произошло.  Четвёртый Сильверлайт позволяет получить доступ к веб камере и микрофону. И пусть это не является революцией, в отличие от многих других новых возможностей (конкурирующие технологии  поддерживали камеру и микрофон уже давно), но мощь, простота и удобство нового API заслуживают того, чтобы на эту часть функциональности четвёртого Сильверлайта Вы обратили самое пристальное внимание. </p>
<ul>
<li><a href="http://pugachev.info/store/sl4va/index.html">Демонстрационное приложение</a></li>
<li><a href="http://pugachev.info/store/sl4va/SilverlightApplicationAudioVideo.zip">Исходный код примеров</a></li>
</ul>
<h1>Работа с веб камерой и микрофоном</h1>
<p>Итак, веб камера и микрофон на компьютере пользователя могут быть, а могут и отсутствовать. Также бывают ситуации, когда есть несколько источников видео и звука. Для того, чтобы определить с какми устройствами мы будем работать, а также в случае необходимости запросить у пользователя доступ к этим устройствам (Сильверлайт не позволяет без явного на то разрешения пользователя получить доступ к веб камере или микрофону), сществует статический класс CaptureDeviceConfiguration. Давайте посмотрим как с этим классом работать. Но предварительно создадим новый проект Сильверлайт приложения в Visual Studio 2010 и добавим на страницу MainPage.xaml некоторую XAML разметку:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">&#60;</font><font color="#800000">StackPanel</font> <font color="#ff0000">Orientation</font><font color="#0000ff">="Vertical"</font> <font color="#ff0000">VerticalAlignment</font><font color="#0000ff">="Center"</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">HorizontalAlignment</font><font color="#0000ff">="Center"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">Rectangle</font> <font color="#ff0000">Width</font><font color="#0000ff">="320"</font> <font color="#ff0000">Height</font><font color="#0000ff">="240"</font> <font color="#ff0000">x:Name</font><font color="#0000ff">="videoRect"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">StackPanel</font> <font color="#ff0000">Orientation</font><font color="#0000ff">="Horizontal"</font> <font color="#ff0000">HorizontalAlignment</font><font color="#0000ff">="Center"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">ListBox</font> <font color="#ff0000">x:Name</font><font color="#0000ff">="VideoSources"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">ListBox.ItemTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">DataTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">TextBlock</font> <font color="#ff0000">Text</font><font color="#0000ff">="{Binding FriendlyName}"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">DataTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">ListBox.ItemTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">ListBox</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">ListBox</font> <font color="#ff0000">x:Name</font><font color="#0000ff">="AudioSources"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">ListBox.ItemTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">DataTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">TextBlock</font> <font color="#ff0000">Text</font><font color="#0000ff">="{Binding FriendlyName}"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">DataTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">ListBox.ItemTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">ListBox</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">StackPanel</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">StackPanel</font> <font color="#ff0000">Orientation</font><font color="#0000ff">="Horizontal"</font> <font color="#ff0000">HorizontalAlignment</font><font color="#0000ff">="Center"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">Button</font> <font color="#ff0000">Margin</font><font color="#0000ff">="5"</font> <font color="#ff0000">Content</font><font color="#0000ff">="Начать захват"</font> <font color="#ff0000">x:Name</font><font color="#0000ff">="startCapture"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">Button</font> <font color="#ff0000">Margin</font><font color="#0000ff">="5"</font> <font color="#ff0000">Content</font><font color="#0000ff">="Остановить захват"</font> <font color="#ff0000">x:Name</font><font color="#0000ff">="endCapture"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">StackPanel</font><font color="#0000ff">&#62;</font><br />
<font color="#0000ff">&#60;/</font><font color="#800000">StackPanel</font><font color="#0000ff">&#62;</font></p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p><span id="more-99"></span><br />
В данной разметке стоит обратить внимание на прямоугольник (Rectangle) «videoRect», именно в нём и будет отображаться видео с веб камеры. </p>
<p>Ниже находятся два списка (ListBox) «VideoSources» и «AudioSources», в них будут отображаться имена устройств источников видео и звука. Пользователь сможет выбрать нужное устройство, щёлкнув на его имя. Кроме того на странице присутствуют две кнопки, которые мы будем использовать для начала и остановки захвата с обоих устройств.</p>
<p>Работающее приложение будет выглядить следующим образом (на скриншоте я демонстрирую значок «спроси меня про Silverlight» через веб камеру):</p>
<p><img src="http://pugachev.info/store/sl4va/01.jpg" alt="image" /></p>
<p>Но, перейдём к исходному коду страницы MainPage.xaml на языке C#. И в конструкторе подпишемся на событие загрузки данной страницы:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">this</font>.Loaded += <font color="#0000ff">new</font> RoutedEventHandler(MainPage_Loaded);</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>В обработчике события получим доступные устройства и отобразим их в наших списках VideoSources и AudioSources соответственно:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">void</font> MainPage_Loaded(<font color="#0000ff">object</font> sender, RoutedEventArgs e)<br />
{<br />
&nbsp;&nbsp;VideoSources.ItemsSource = CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices();<br />
&nbsp;&nbsp;AudioSources.ItemsSource = CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices();<br />
}</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Класс CaptureDeviceConfiguration позволяет получить список всех устройств видео и аудио захвата, а также устройства по-умолчанию с помощью методов GetDefaultVideoCaptureDevice и GetDefaultAudioCaptureDevice соответственно. Устройства по-умолчанию устанавливаются автоматически, но пользователь может их настроить с помощью утилиты «Microsoft Silverlight Configuration». Чтобы запустить данную утилиту щёлкните правой кнопкой мыши на любом Сильверлайт приложении и выберите в контекстном меню пункт «Silverlight». Откроется нужное нам окно, в котором в четвёртой версии Сильверлайта появилась новая вкладка «Webcam / Mic».</p>
<p><img src="http://pugachev.info/store/sl4va/02.jpg" alt="image" /></p>
<p>Можете поменять устройства по-умолчанию или отставить их прежними. А мы пока переходим назад к исходному коду.</p>
<p>Итак, теперь мы добавим в класс MainPage поле типа CaptureSource. Объекты данного класса   используются для захвата видео и звука с соответствующих устройств.</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">private</font> CaptureSource _captureSource;</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>В методе MainPage_Loaded инициализируем только что созданное поле:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black">_captureSource = </font><font color="#0000ff">new</font> CaptureSource();</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Теперь определим действия, выполняемые при нажатии кнопки начала захвата. Для этого добавим обработчик события «Click» соответствующей кнопки (startCapture) и в обработчике напишем следующий код:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">private</font> <font color="#0000ff">void</font> startCapture_Click(<font color="#0000ff">object</font> sender, RoutedEventArgs e)<br />
{<br />
&nbsp;&nbsp;<font color="#0000ff">if</font> (_captureSource != <font color="#0000ff">null</font>)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.Stop();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.VideoCaptureDevice = (VideoCaptureDevice)VideoSources.SelectedItem;<br />
&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.AudioCaptureDevice = (AudioCaptureDevice)AudioSources.SelectedItem;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;VideoBrush vidBrush = <font color="#0000ff">new</font> VideoBrush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;vidBrush.SetSource(_captureSource);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;videoRect.Fill = vidBrush;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (CaptureDeviceConfiguration.AllowedDeviceAccess ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CaptureDeviceConfiguration.RequestDeviceAccess())<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.Start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Вначале мы проверяем, что медиа источник _captureSource не равен null, и останавливаем весь текущий захват для данного источника. После этого мы устанавливаем для _captureSource выбранные пользователем устройства захвата видео и звука, и создаём кисть (vidBrush), которая будет в реальном времени заполнять прямоугольник videoRect видео, получаемым с веб камеры.</p>
<p>Но это ещё не всё. Перед тем, как начать захват, нам надо проверить, что у нас есть нужные права доступа (CaptureDeviceConfiguration.AllowedDeviceAccess) и в случае их отсутствия запросить доступ у пользователя (CaptureDeviceConfiguration.RequestDeviceAccess()).</p>
<p>При запросе разрешений, пользователь увидит похожее диалоговое окно:</p>
<p><img src="http://pugachev.info/store/sl4va/03.jpg" alt="image" /></p>
<p>И если он нажмёт «Yes», мы сможем начать захват (_captureSource.Start()). В противном случем остаётся только корить судьбу за недоверчивых пользователей.</p>
<p>Обработчик кнопки остановки захвата значительно проще. Его код достаточно очевиден:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">private</font> <font color="#0000ff">void</font> endCapture_Click(<font color="#0000ff">object</font> sender, RoutedEventArgs e)<br />
{<br />
&nbsp;&nbsp;<font color="#0000ff">if</font> (_captureSource != <font color="#0000ff">null</font>)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.Stop();<br />
&nbsp;&nbsp;}<br />
}</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Всё, базовое приложение готово. Запустите его и у Вас появится уникальная возможность посмотреть на мир глазами веб камеры.</p>
<p>Далее приводится полный C# код страницы MainPage:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">public</font> <font color="#0000ff">partial</font> <font color="#0000ff">class</font> MainPage : UserControl<br />
{<br />
&nbsp;&nbsp;<font color="#0000ff">private</font> CaptureSource _captureSource;</p>
<p>&nbsp;&nbsp;<font color="#0000ff">public</font> MainPage()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">this</font>.Loaded += <font color="#0000ff">new</font> RoutedEventHandler(MainPage_Loaded);<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;<font color="#0000ff">void</font> MainPage_Loaded(<font color="#0000ff">object</font> sender, RoutedEventArgs e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;VideoSources.ItemsSource = CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices();<br />
&nbsp;&nbsp;&nbsp;&nbsp;AudioSources.ItemsSource = CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;_captureSource = <font color="#0000ff">new</font> CaptureSource();<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;<font color="#0000ff">private</font> <font color="#0000ff">void</font> startCapture_Click(<font color="#0000ff">object</font> sender, RoutedEventArgs e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (_captureSource != <font color="#0000ff">null</font>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.Stop();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.VideoCaptureDevice = (VideoCaptureDevice)VideoSources.SelectedItem;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.AudioCaptureDevice = (AudioCaptureDevice)AudioSources.SelectedItem;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VideoBrush vidBrush = <font color="#0000ff">new</font> VideoBrush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vidBrush.SetSource(_captureSource);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;videoRect.Fill = vidBrush;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (CaptureDeviceConfiguration.AllowedDeviceAccess ||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CaptureDeviceConfiguration.RequestDeviceAccess())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.Start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;<font color="#0000ff">private</font> <font color="#0000ff">void</font> endCapture_Click(<font color="#0000ff">object</font> sender, RoutedEventArgs e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (_captureSource != <font color="#0000ff">null</font>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.Stop();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<h1>Снятие моментальных снимков</h1>
<p>Приложение работает. Но хочется чего-то ещё. Например, хочется нажать кнопку и сохранить в виде картинки то, что в данный момент показывает камера. Нет ничего проще. В первую очередь нам надо добавить кнопку.</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">&#60;</font><font color="#800000">Button</font> <font color="#ff0000">Margin</font><font color="#0000ff">="5"</font> <font color="#ff0000">Content</font><font color="#0000ff">="Snapshot"</font> <font color="#ff0000">x:Name</font><font color="#0000ff">="takeSnapshot"</font> <font color="#ff0000">Click</font><font color="#0000ff">="takeSnapshot_Click"</font><font color="#0000ff">/&#62;</font></p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Также необходимо создать обработчик события нажатия на данную кнопку. И добавить в XAML разметку код для отображения наших моментальных снимков:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">&#60;</font><font color="#800000">ScrollViewer</font> <font color="#ff0000">Width</font><font color="#0000ff">="400"</font> <font color="#ff0000">VerticalScrollBarVisibility</font><font color="#0000ff">="Hidden"</font> <font color="#ff0000">HorizontalScrollBarVisibility</font><font color="#0000ff">="Auto"</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">HorizontalAlignment</font><font color="#0000ff">="Center"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">ItemsControl</font> <font color="#ff0000">x:Name</font><font color="#0000ff">="snapshots"</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">ItemsControl.ItemTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">DataTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">Image</font> <font color="#ff0000">Source</font><font color="#0000ff">="{Binding}"</font> <font color="#ff0000">Margin</font><font color="#0000ff">="5"</font> <font color="#ff0000">Height</font><font color="#0000ff">="50"</font> <font color="#ff0000">Stretch</font><font color="#0000ff">="UniformToFill"</font><font color="#0000ff">&#62;&#60;/</font><font color="#800000">Image</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">DataTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">ItemsControl.ItemTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">ItemsControl.ItemsPanel</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">ItemsPanelTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;</font><font color="#800000">StackPanel</font> <font color="#ff0000">Orientation</font><font color="#0000ff">="Horizontal"</font><font color="#0000ff">/&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">ItemsPanelTemplate</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">ItemsControl.ItemsPanel</font><font color="#0000ff">&#62;</font><br />
&nbsp;&nbsp;<font color="#0000ff">&#60;/</font><font color="#800000">ItemsControl</font><font color="#0000ff">&#62;</font><br />
<font color="#0000ff">&#60;/</font><font color="#800000">ScrollViewer</font><font color="#0000ff">&#62;</font></p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Мы создаём область прокрутки (ScrollViewer), где будут находиться моментальные снимки. За их отображение отвечает элемент ItemsControl.</p>
<p>Добавим в класс MainPage поле «_images», в котором будут храниться снимки:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">private</font> ObservableCollection&#60;WriteableBitmap&#62; _images = <font color="#0000ff">new</font> ObservableCollection&#60;WriteableBitmap&#62;();</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>А в обработчике нажатия на кнопку «takeSnapshot» и напишем следующий код:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black"></font><font color="#0000ff">private</font> <font color="#0000ff">void</font> takeSnapshot_Click(<font color="#0000ff">object</font> sender, RoutedEventArgs e)<br />
{<br />
&nbsp;&nbsp;<font color="#0000ff">if</font> (_captureSource != <font color="#0000ff">null</font>)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;_captureSource.AsyncCaptureImage((snapImage) =&#62;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_images.Add(snapImage);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;}<br />
}</p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Здесь мы асинхронно добавляем в коллекцию снимков новый моментальный снимок. </p>
<p>Всё, что теперь нам осталось сделать – это связать коллекцию «_images» с визуальным представлением. Для этого в методе MainPage_Loaded допишем следующий код:</p>
<blockquote><p><code><font size="2" face="Courier New" color="black">snapshots.ItemsSource = _images;</font></p>
<p><font size="1" color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font></code></p></blockquote>
<p>Теперь приложение можно запустить. А если что-то можно сделать, то давайте сделаем это. Запустите приложение и попробуйте снять несколько моментальных снимков, не зря же мы писали данную функциональность.</p>
<p><img src="http://pugachev.info/store/sl4va/04.jpg" alt="image" /></p>
]]></content:encoded>
			<wfw:commentRss>http://pugachev.info/archives/99/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

