<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Блог Сергея Байдачного</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/sbaidachni/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/sbaidachni/feed.xml</link>
    <description />
    <lastBuildDate>Tue, 16 Apr 2019 05:50:02 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>SilverLight 3: Local Connection</title>
      <link>https://docs.microsoft.com/archive/blogs/sbaidachni/silverlight-3-local-connection</link>
      <pubDate>Mon, 13 Apr 2009 08:17:46 GMT</pubDate>
      <dc:creator><![CDATA[sbaidachni]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sbaidachni/2009/04/13/silverlight-3-local-connection/</guid>
      <description><![CDATA[Рассмотрим пространство имен System.Windows.Messaging, которое позволяет наладить взаимодействие...]]></description>
      <content:encoded><![CDATA[<p>Рассмотрим пространство имен <strong>System.Windows.Messaging</strong>, которое позволяет наладить взаимодействие между несколькими приложениями SilverLight.</p> <p>Создадим простое приложение, которое отображает эллипс двигающийся снизу вверх:</p> <p>&lt;UserControl x:Class="SilverlightApplication57.MainPage"<br>&nbsp;&nbsp;&nbsp; xmlns="<a href="https://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;">https://schemas.microsoft.com/winfx/2006/xaml/presentation"</a><br>&nbsp;&nbsp;&nbsp; xmlns:x="<a href="https://schemas.microsoft.com/winfx/2006/xaml&quot;">https://schemas.microsoft.com/winfx/2006/xaml"</a><br>&nbsp;&nbsp;&nbsp; Width="400" Height="300" Loaded=”UserControl_Loaded”&gt;<br>&nbsp;&nbsp;&nbsp; &lt;UserControl.Resources&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Storyboard x:Name="sb1" Completed="sb1_Completed"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DoubleAnimation Storyboard.TargetName="el1" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Storyboard.TargetProperty="(Canvas.Top)"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; From="300" To="-30" Duration="0:0:5"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DoubleAnimation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Storyboard&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/UserControl.Resources&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Canvas x:Name="LayoutRoot" Background="White"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Ellipse x:Name="el1" Width="30" Height="30" Fill="Blue" Canvas.Left="200" Canvas.Top="300"&gt;&lt;/Ellipse&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/Canvas&gt;<br>&lt;/UserControl&gt;  <p>Запуск анимации будет происходить при загрузке главного контейнера:</p> <p>private void UserControl_Loaded(object sender, RoutedEventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp; sb1.Begin();<br>} </p> <p>Создайте второе приложение, которое будет содержать точно такой же код, за исключением метода UserControl_Loaded. Разместите приложения на HTML странице следующим образом:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3LocalConnection_9411/image_4.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3LocalConnection_9411/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3LocalConnection_9411/image_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3LocalConnection_9411/image_thumb_1.png" width="234" height="244"></a> </p> <p>Давайте попробуем реализовать код прриложений таким образом, чтобы после окончания анимации в приложении 1, запускалась анимация во втором приложении. Таким образом, мы должны достигнуть эффета, когда наш шарик будет “перелетать” из одного приложения в другое.  <p>Реализуем следующий код в первом приложении:  <p>LocalMessageSender msgSender = new LocalMessageSender("DownSide");  <p>public MainPage()<br>{<br>&nbsp;&nbsp;&nbsp; InitializeComponent();  <p>&nbsp;&nbsp;&nbsp; LocalMessageReceiver receiver = new LocalMessageReceiver("UpSide");<br>&nbsp;&nbsp;&nbsp; receiver.MessageReceived += new EventHandler&lt;MessageReceivedEventArgs&gt;(receiver_MessageReceived);<br>&nbsp;&nbsp;&nbsp; receiver.Listen();<br>}  <p>void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp; sb1.Begin();<br>}  <p>private void sb1_Completed(object sender, EventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp; msgSender.SendAsync("start");<br>}  <p>Тут мы создали объект типа <strong>LocalMessageSender</strong>, в задачи которого входит отправка сообщения “слушателю” с указанным именем (DownSide, наверное стоило назвать по другому). Этот метод отправляет сообщение сразу после окончания анимации с помощью метода <strong>SendAsync</strong> (фактически передает управление другому приложению).  <p>Объект <strong>LocalMessageReceiver</strong>, напротив, ожидает сообщение от других приложений. Как только сообщение приходит (второе приложение закончило анимацию), то тут же анимация запускается повторно (полетел еще один шарик).  <p>Код во втором приложении выглядит аналогично:  <p>LocalMessageSender msgSender = new LocalMessageSender("UpSide");  <p>public MainPage()<br>{<br>&nbsp;&nbsp;&nbsp; InitializeComponent();  <p>&nbsp;&nbsp;&nbsp; LocalMessageReceiver receiver = new LocalMessageReceiver("DownSide");<br>&nbsp;&nbsp;&nbsp; receiver.MessageReceived += new EventHandler&lt;MessageReceivedEventArgs&gt;(receiver_MessageReceived);<br>&nbsp;&nbsp;&nbsp; receiver.Listen();<br>}  <p>void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp; sb1.Begin();<br>}  <p>private void sb1_Completed(object sender, EventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp; msgSender.SendAsync("start");<br>}  <p>Откомпилировав и запустив данный пример, мы получим желаемый эффект:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3LocalConnection_9411/image_2.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3LocalConnection_9411/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3LocalConnection_9411/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3LocalConnection_9411/image_thumb.png" width="183" height="244"></a> </p> <p>Следует отметить, что если Ваши приложения загружаются из различных доменов, то наладить взаимодействие между ними также возможно. Для этого просто следует указать имя домена в конструкторе классов LocalMessage…</p>]]></content:encoded>
    </item>
    <item>
      <title>SilverLight 3: Pixel API</title>
      <link>https://docs.microsoft.com/archive/blogs/sbaidachni/silverlight-3-pixel-api</link>
      <pubDate>Mon, 13 Apr 2009 02:49:46 GMT</pubDate>
      <dc:creator><![CDATA[sbaidachni]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sbaidachni/2009/04/13/silverlight-3-pixel-api/</guid>
      <description><![CDATA[Кто-то на одном из семинаров спрашивал меня о том, как можно сделать скриншот интерфейса SilverLight...]]></description>
      <content:encoded><![CDATA[<p>Кто-то на одном из семинаров спрашивал меня о том, как можно сделать скриншот интерфейса SilverLight приложения и сохранить его в виде изображения на диск. С этого примера и начнем.</p> <p>Для начала создадим интерфейс приложения, состоящий из примитивной формы и панели для отображения нашего снимка:</p> <p>&lt;UserControl x:Class="SilverlightApplication56.MainPage"<br>&nbsp;&nbsp;&nbsp; xmlns="<a href="https://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;">https://schemas.microsoft.com/winfx/2006/xaml/presentation"</a><br>&nbsp;&nbsp;&nbsp; xmlns:x="<a href="https://schemas.microsoft.com/winfx/2006/xaml&quot;">https://schemas.microsoft.com/winfx/2006/xaml"</a><br>&nbsp;&nbsp;&nbsp; Width="800" Height="600"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Grid x:Name="LayoutRoot" Background="White"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Grid.ColumnDefinitions&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ColumnDefinition&gt;&lt;/ColumnDefinition&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ColumnDefinition&gt;&lt;/ColumnDefinition&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Grid.ColumnDefinitions&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel Grid.Column="0"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBox Width="100"&gt;&lt;/TextBox&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBox Width="100"&gt;&lt;/TextBox&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button Width="100" Content="Update" Click="Button_Click"&gt;&lt;/Button&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel x:Name="stk1" Grid.Column="1" VerticalAlignment="Center"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/Grid&gt;<br>&lt;/UserControl&gt;  <p>Чтобы пример был более эффектным, будем делать снимок не просто формы, а всего интерфейса, включая и панель со снимком. Чтобы реализовать такой код, нам понадобится класс <strong>WritableBitmap</strong>. Вот он то и представляет собой реализацию Pixel API в SilverLight 3. Этот класс содержится в пространстве имен <strong>System.Windows.Media.Imaging</strong> и позволяет создать Bitmap контекст заданного размера (длина, ширина изображения). Доступ к изображению может быть осуществлен попиксельно, используя простой индексатор.</p> <p>В нашем примере мы используем метод <strong>Render</strong>, который позволяет преобразовать в изображение любой графический элемент, включая его дочерние элементы.</p> <p>private void Button_Click(object sender, RoutedEventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp; WriteableBitmap bit = new WriteableBitmap(this.Width, this.Height, PixelFormats.Pbgra32);<br>&nbsp;&nbsp;&nbsp; bit.Render(LayoutRoot, new MatrixTransform());<br>&nbsp;&nbsp;&nbsp; Image img = new Image();<br>&nbsp;&nbsp;&nbsp; img.Source = bit;<br>&nbsp;&nbsp;&nbsp; stk1.Children.Clear();<br>&nbsp;&nbsp;&nbsp; stk1.Children.Add(img);<br>}  <p>Вот так будет выглядить наше приложение после многократного нажатия кнопки Update.</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3PixelAPI_B694/image_2.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3PixelAPI_B694/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3PixelAPI_B694/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3PixelAPI_B694/image_thumb.png" width="244" height="126"></a></p>]]></content:encoded>
    </item>
    <item>
      <title>SilverLight 3: GPU Acceleration, RenderForAnimation, Smooth Streaming</title>
      <link>https://docs.microsoft.com/archive/blogs/sbaidachni/silverlight-3-gpu-acceleration-renderforanimation-smooth-streaming</link>
      <pubDate>Thu, 02 Apr 2009 09:33:38 GMT</pubDate>
      <dc:creator><![CDATA[sbaidachni]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sbaidachni/2009/04/02/silverlight-3-gpu-acceleration-renderforanimation-smooth-streaming/</guid>
      <description><![CDATA[GPU Acceleration На всех семинарах мне задают один и тот же вопрос: Вы анонсировали GPU оптимизацию,...]]></description>
      <content:encoded><![CDATA[<p><strong>GPU Acceleration</strong></p> <p>На всех семинарах мне задают один и тот же вопрос: Вы анонсировали GPU оптимизацию, но мы не смогли заметить разницу. </p> <p>На самом деле, если разработчик не выполнит ряд действий, которые почему-то пока не описаны в документации, никакой работы через GPU в его приложении не будет. Давайте посмотрим, что же необходимо сделать для включения оптимизации с помощью GPU.</p> <p>1). Оптимизация через GPU делает в SilverLight только первые шаги и не предоставляет пока много возможностей. На графический процессор можно пока расчитывать только в двух случаях: при отображении видео и при отображении растровых изображений. При этом речь идет не столько о простом отображении картинки или видео, как об использовании ряда эффектов. </p> <p>Фактически можно выделить три типа эффектов, которые поддерживаются в бета 1: а). трансформации изображения, б). урезание прямоугольной части изображения, с). смешивание пикселей в области медиа элемента или рисунка (отображение каки-то рекламных вставок, панели инструментов, управление прозрачностью). </p> <p>2). GPU поддерживается только на Windows платформе. Совершенно не важно, работает ваше приложение в окне браузера или в полноэкранном режиме. Если говорить о Mac, то тут поддержка осуществляется только в полноэкранном режиме. При этом ваша видеокарта должна поддерживать DirectX9.0C или выше.</p> <p>3). Для включения оптимизации с помощью GPU необходимо:</p> <p>а) задать эту опцию при создании плагина с помощью параметра <strong>EnableGPUAcceleration</strong>.</p> <p>&lt;param name="EnableGPUAcceleration" value="true" /&gt;</p> <p>б) включить оптимизацию для конкретного элемента&nbsp; управления. Это делается с помощью свойства <strong>CacheMode</strong>, которое должно быть установлено в значение <strong>BitmapCache</strong>.</p> <p>&lt;MediaElement Source="a.wmv" Width="500" Height="300" CacheMode="BitmapCache"&gt;</p> <p>При этом свойство автоматически устанавливается и для всех дочерних элементов дерева.</p> <p>Если Вы хотите посмотреть, в каких из областей экрана работает оптимизация с помощью GPU добавьте еще один элемент к параметрам плагина:</p> <p>&lt;param name=”EnableCacheVisualization” value=”true” /&gt;</p> <p><strong>RenderForAnimation</strong></p> <p>Раз уж я завел речь об оптимизации, то хочу сделать акцент на новом свойстве <strong>RenderOptions.TextRenderingMode</strong>, которое применимо к элементам, отображающим текст. Дело в том, что в SilverLight работает достаточно сложный процесс, который оптимизмрует отображение текста, занимаясь его сглиживанием. Но если вы используете текст для анимации, то выглядит это не всехгда впечатляюще. Часть фреймов могут теряться, текст выглядит подергивающимся. Свойство <strong>RenderOptions.TextRenderingMode</strong>, установленное в значение <strong>RenderForAnimation</strong> позволяет отключить оптимизацию при отображении текста и тем самым ускорить анимацию.</p> <p><strong>Smooth Streaming</strong></p> <p>Чтобы увидеть Smooth Streaming в действии, посетите сайт <a title="https://www.smoothhd.com/" href="https://www.smoothhd.com/">https://www.smoothhd.com/</a>. Рекомендую перейти в раздел Blender и посмотреть видео Big Bucks Bunny:)</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3GPUAccelerationRenderForAnim_D772/image_2.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3GPUAccelerationRenderForAnim_D772/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3GPUAccelerationRenderForAnim_D772/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3GPUAccelerationRenderForAnim_D772/image_thumb.png" width="191" height="378"></a></p> <p>Итак, при доставке видео клиенту существует несколько проблем: 1). у пользователя может быть плохой канал, который недостаточен для отображения видео в текущем разрешении; 2). у пользователя может быть загружен процессор, что не позволит ему справится с отображением видео; 3). параметры нагрузки на канал и процессор пользователя регулярно меняются. Имея эти проблемы выложить несколько вариантов ролика, предназначенного на различные каналы явно недостаточно. </p> <p>Чтобы справится с&nbsp; проблемой IIS 7 Media Service представляет специальное расширение Smooth Streaming.</p> <p>Идея Smooth Streaming состит в том, что Media service располагает сразу несколькими вариантами видео фрагмента (1280х720, 1024х768 и т. д.) и транслирует видео клиенту небольшими порциями, выбирая наиболее подходящий вариант, базируясь на параметрах канала.</p> <p>Естественно, чтобы доставлять видео хорошего разрешения с помощью Smooth Streaming необходимо преобразовать исходный файл, сгенерировав различные варианты потоков. Для этого можно использовать Microsoft Expression Encoder 2 SP1, который поддерживает специальный шаблон Adaptive Streaming и позволяет генерировать до 10 потоков. </p> <p>Далее остается только установить расширение в IIS и передать поток в SilverLight. MediaElement в SilverLight 3 уже поддерживает эту функциональность.</p> <p>Дополнительно о том, как настроить Smooth Streaming в IIS вы можете узнать по ссылке:</p> <p><a title="https://www.iis.net/extensions/SmoothStreaming" href="https://www.iis.net/extensions/SmoothStreaming">https://www.iis.net/extensions/SmoothStreaming</a></p>]]></content:encoded>
    </item>
    <item>
      <title>SilverLight 3: Новые элементы управления</title>
      <link>https://docs.microsoft.com/archive/blogs/sbaidachni/silverlight-3</link>
      <pubDate>Thu, 02 Apr 2009 08:15:45 GMT</pubDate>
      <dc:creator><![CDATA[sbaidachni]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sbaidachni/2009/04/02/silverlight-3/</guid>
      <description><![CDATA[Всю неделю колесил по стране и не мог писать. Получил один штраф за превышение скорости и помял...]]></description>
      <content:encoded><![CDATA[<p>Всю неделю колесил по стране и не мог писать. Получил один штраф за превышение скорости и помял четыре диска. Хорошо, что наши разработчики не такие как наши дороги. Но на этой неделе никаких поездок не планируется, поэтому пишу дальше.</p> <p>Рассматривая существующие элементы управления можно выделить несколько отдельных групп:</p> <ul> <li>элементы управления, которые входят в стандартную поставку плагина – тут практически ничего не изменилось. О небольших изменениях для ListBox, тултипах, SaveFileDialog и валидаторе я писал ранее. С одной стороны в плагине есть все необходимое, а с другой – увеличение количества элементов привело бы к росту размера плагина;  <li>элементы, которые входят в SDK – тут присутствует около двух десятков элементов управления, расширяющих существующую иерархию такими элементами, как DataGrid, Calendar и др. Если Вы используете эти элементы, то вместе со своим приложением необходимо поставлять сборку, в которой они расположены. Основные сборки, содержащие элементы управления, это System.Windows.Controls.dll, System.Windows.Controls.Data.DataForm.dll, System.Windows.Controls.Navigation.dll, System.Windows.Controls.Data.dll, System.Windows.Controls.Input.dll;  <li>элементы, которые входят в Toolkit, развиваемый как OpenSource проект на codeplex.com (<a href="https://www.codeplex.com/silverlight">https://www.codeplex.com/silverlight</a>). Нужно отметить, что многие из этих элементов мигрируют в официальный SDK сразу после стабилизации, но Toolkit развивается довольно динамично, поэтому разработчики могут найти что-то интересное для себя;  <li>платные элементы управления – сегодня существует множество компаний, которые предлагают свои библиотеки. </li></ul> <p>В этой статье мы поговорим о новых элементах, которые были добавлены в SDK.</p> <p><strong>Простые элементы управления</strong></p> <p><strong><em>ChildWindow</em></strong></p> <p>Элемент ChildWindows позволяет Вам достаточно оперативно создать всплывающее окно, блокирующее весь остальной интерфейс. Если Вы используете Visual Studio, то для создания простейшего окна достаточно добавить в проект новый элемент на основе шаблона <strong>SilverLight Child Window</strong>. Данный шаблон создает XAML файл, описывающий Child окно и ассоциированный с ним код:</p> <p><strong>.XAML файл</strong></p> <p>&lt;controls:ChildWindow x:Class="SilverlightApplication47.ChildWindow1" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns="<a href="https://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;">https://schemas.microsoft.com/winfx/2006/xaml/presentation"</a> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:x="<a href="https://schemas.microsoft.com/winfx/2006/xaml&quot;">https://schemas.microsoft.com/winfx/2006/xaml"</a> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Width="400" Height="300" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Title="ChildWindow1"&gt; <br>&nbsp;&nbsp;&nbsp; &lt;Grid x:Name="LayoutRoot" Margin="2"&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Grid.RowDefinitions&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RowDefinition /&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RowDefinition Height="Auto" /&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Grid.RowDefinitions&gt; </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" /&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1" /&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/Grid&gt; <br>&lt;/controls:ChildWindow&gt;</p> <p><strong>.CS файл</strong></p> <p>public partial class ChildWindow1 : ChildWindow <br>{ <br>&nbsp;&nbsp;&nbsp; public ChildWindow1() <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent(); <br>&nbsp;&nbsp;&nbsp; } </p> <p>&nbsp;&nbsp;&nbsp; private void OKButton_Click(object sender, RoutedEventArgs e) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.DialogResult = true; <br>&nbsp;&nbsp;&nbsp; } </p> <p>&nbsp;&nbsp;&nbsp; private void CancelButton_Click(object sender, RoutedEventArgs e) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.DialogResult = false; <br>&nbsp;&nbsp;&nbsp; } <br>}</p> <p>Инициировать вызов такого окна достаточно просто:</p> <p>ChildWindow1 child = new ChildWindow1(); <br>child.Show();</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight34_751F/image_2.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight34_751F/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight34_751F/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight34_751F/image_thumb.png" width="244" height="149"></a> </p> <p>&nbsp;</p> <p><strong><em>Элемент Expander, HeaderedContentControl, HeaderedItemsControl</em></strong></p> <p>Следующий элемент представляет собой распахивающуюся панель. </p> <p>&lt;controls:Expander Header="This is a header" FontSize="18" BorderThickness="1" BorderBrush="Gray" &gt; <br>&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="This is a text"&gt;&lt;/TextBlock&gt;&nbsp;&nbsp;&nbsp; <br>&lt;/controls:Expander&gt;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight34_751F/image_4.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight34_751F/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight34_751F/image_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight34_751F/image_thumb_1.png" width="244" height="54"></a> </p> <p>Поскольку Expander является наследником от <strong>HeaderedContentControl</strong>, Вы можете использовать более сложный формат для создания заголовка и содержимого:</p> <p>&lt;controls:Expander BorderThickness="1" BorderBrush="Gray" &gt;<br>&nbsp;&nbsp;&nbsp; &lt;controls:HeaderedContentControl.Header&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="This is a header" FontSize="18"&gt;&lt;/TextBlock&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/controls:HeaderedContentControl.Header&gt;<br>&nbsp;&nbsp;&nbsp; &lt;controls:HeaderedContentControl.Content&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="This is a text"&gt;&lt;/TextBlock&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/controls:HeaderedContentControl.Content&gt;&nbsp;&nbsp;&nbsp; <br>&lt;/controls:Expander&gt;</p> <p>Используя этот механизм Вы можете установить в качестве заголовка любое содержимое.  <p>Элемент <strong>HeaderedContentControl</strong> можно использовать как самостоятельный элемент:  <p>&lt;controls:HeaderedContentControl&nbsp; &gt;<br>&nbsp;&nbsp;&nbsp; &lt;controls:HeaderedContentControl.Header&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="This is a header" FontSize="18"&gt;&lt;/TextBlock&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/controls:HeaderedContentControl.Header&gt;<br>&nbsp;&nbsp;&nbsp; &lt;controls:HeaderedContentControl.Content&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="This is a text"&gt;&lt;/TextBlock&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/controls:HeaderedContentControl.Content&gt;&nbsp;&nbsp;&nbsp; <br>&lt;/controls:HeaderedContentControl&gt;  <p>Если Вы хотите отобразить набор повторяющихся элементов с заголовком, Вы можете использовать <strong>HeaderedItemsControl</strong>:</p> <p>&lt;controls:HeaderedItemsControl&gt;<br>&nbsp;&nbsp;&nbsp; &lt;controls:HeaderedItemsControl.Header&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="This is a header" FontSize="18"&gt;&lt;/TextBlock&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/controls:HeaderedItemsControl.Header&gt;<br>&nbsp;&nbsp;&nbsp; &lt;controls:HeaderedItemsControl.Items&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="Item 1"&gt;&lt;/TextBlock&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="Item 2"&gt;&lt;/TextBlock&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/controls:HeaderedItemsControl.Items&gt;&nbsp;&nbsp;&nbsp; <br>&lt;/controls:HeaderedItemsControl&gt;  <p>Пример выше вряд ли может показаться интересным, а вот биндинг с динамическим набором элементов значительно интересней:  <p>itemsCol.ItemsSource = new string[] { "Sunday", "Monday", "Tuesday" };  <p>&lt;controls:HeaderedItemsControl x:Name="itemsCol"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;controls:HeaderedItemsControl.Header&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="This is a header" FontSize="18"&gt;&lt;/TextBlock&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/controls:HeaderedItemsControl.Header&gt;<br>&nbsp;&nbsp;&nbsp; &lt;controls:HeaderedItemsControl.ItemTemplate&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding}"&gt;&lt;/TextBlock&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataTemplate&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/controls:HeaderedItemsControl.ItemTemplate&gt;&nbsp;&nbsp;&nbsp; <br>&lt;/controls:HeaderedItemsControl&gt;  <p><strong><em>Элемент TreeView</em></strong></p> <p>Следующий элемент управления, это <strong>TreeView</strong>. Как и другие элементы управления <strong>TreeView</strong> позволяет в качестве элементов дерева использовать любой контент.Вот пример использования элемента.</p> <p>&lt;controls:TreeView&gt;<br>&nbsp;&nbsp;&nbsp; &lt;controls:TreeViewItem IsExpanded="True"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;controls:TreeViewItem.Header&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="Hello"&gt;&lt;/TextBlock&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/controls:TreeViewItem.Header&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;controls:TreeViewItem Header="SubItem"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/controls:TreeViewItem&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/controls:TreeViewItem&gt;<br>&lt;/controls:TreeView&gt;  <p><strong><em>Элемент AutoCompleteBox</em></strong></p> <p>В отличии от предыдущих элементов, элемент AutoCompleteBox находится в сборке System.Windows.Controls.Input.dll. Этот элемент позволяет отобразить поле для ввода текста и предоставляет возможность динамически установить массив строк для отображения подсказок и автоматического заполнения. Вот пример использования:</p> <p>box.ItemsSource = new string[] { "Sunday", "Monday", "Tuesday" };</p> <p>&lt;input:AutoCompleteBox Width="100" x:Name="box"&gt;&lt;/input:AutoCompleteBox&gt; </p> <p><strong><em>Элемент Label</em></strong></p> <p>Элемент управления <strong>Label</strong> позволяет отобразить “надпись”. В отличии от <strong>TextBlock</strong> элемент <strong>Label</strong> способен отображать любой контент в качестве метки. Вот пример использования:</p> <p>&lt;controls:Label Content="TreeView" /&gt;</p>]]></content:encoded>
    </item>
    <item>
      <title>Новое видео с Дней разработчиков в Киеве</title>
      <link>https://docs.microsoft.com/archive/blogs/sbaidachni/63</link>
      <pubDate>Tue, 31 Mar 2009 09:21:36 GMT</pubDate>
      <dc:creator><![CDATA[sbaidachni]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sbaidachni/2009/03/31/63/</guid>
      <description><![CDATA[Коллеги, даю прямые ссылки на новое видео:  Windows Communication Foundation – Виктор Шатохин...]]></description>
      <content:encoded><![CDATA[<p>Коллеги, даю прямые ссылки на новое видео:  <p><a href="https://silverlight.services.live.com/52153/WCF_Shatokhin/video.wmv">Windows Communication Foundation – Виктор Шатохин</a>  <p><a href="https://silverlight.services.live.com/52153/WF_Shatokhin/video.wmv">Windows Workflow Foundation – Виктор Шатохин</a>  <p><a href="https://silverlight.services.live.com/52153/ADO_NET_Data_Services_Shatokhin/video.wmv">Введение в ADO.NET Data Services – Виктор Шатохин</a>  <p><a href="https://silverlight.services.live.com/52153/SilverLight_3_Baydachnyy/video.wmv">Введение в SilverLight 3 – Сергей Байдачный</a></p>]]></content:encoded>
    </item>
    <item>
      <title>SilverLight 3: Что нового? (часть 3)</title>
      <link>https://docs.microsoft.com/archive/blogs/sbaidachni/silverlight-3-3</link>
      <pubDate>Thu, 19 Mar 2009 03:37:09 GMT</pubDate>
      <dc:creator><![CDATA[sbaidachni]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sbaidachni/2009/03/19/silverlight-3-3/</guid>
      <description><![CDATA[Наконец я прибыл в Минск. Через полтора часа у меня встреча и большая надежда на Интернет. Уже...]]></description>
      <content:encoded><![CDATA[<p>Наконец я прибыл в Минск. Через полтора часа у меня встреча и большая надежда на Интернет. Уже сейчас узнал, что анонс SilverLight 3 таки состоялся и даже появилась документация (вы не поверите, но у меня ее еще нет). Была слабая надежда на то, что тут есть платный зал ожидания. Он таки есть, но туда лучше не ходить. В обычном зале ожидания стулья железные и холодные. Ничего, я слышал, что теплые вредно, а холодные не дадут заснуть. Пишем дальше:)</p> <p><strong>Проверка данных при связывании</strong></p> <p>Рассмотрим небольшой пример. Для этого опишем простой класс Employee с двумя полями:</p> <p align="left">&nbsp;&nbsp;&nbsp; public class Employee <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string firstName; </p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string FirstName <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return firstName; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!value.Equals("Sergey")) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception("First Name must be Sergey!"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstName = value; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string lastName; </p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string LastName <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return lastName; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { lastName = value; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Employee(string fName, string lName) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.FirstName = fName; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.LastName = lName; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; }</p> <p>А также опишем форму, которая связана с объектом типа Employee</p> <p>&lt;StackPanel x:Name="LayoutRoot" Background="White" Loaded="LayoutRoot_Loaded"&gt; <br>&nbsp;&nbsp;&nbsp; &lt;TextBox Width="100" Text="{Binding FirstName, Mode=TwoWay}"&gt;&lt;/TextBox&gt; <br>&nbsp;&nbsp;&nbsp; &lt;TextBox Width="100" Text="{Binding LastName, Mode=TwoWay}"&gt;&lt;/TextBox&gt; <br>&lt;/StackPanel&gt;</p> <p>И код:</p> <p>Employee emp; </p> <p>private void LayoutRoot_Loaded(object sender, RoutedEventArgs e) <br>{ <br>&nbsp;&nbsp;&nbsp; emp = new Employee("Sergey","B"); <br>&nbsp;&nbsp;&nbsp; LayoutRoot.DataContext = emp; <br>}</p> <p>Как видно из реализации класса Employee, в качестве имени может быть установленно только Sergey. В SilverLight 3 есть два хороших механизма по обработке ошибок при связывании с данными.</p> <p>Первый механизм, это специальный элемент управления, который будет нотифицировать пользователя об ошибке связывания. Для этого внесем небольшие изменения в описание TextBox.</p> <p>&lt;TextBox Width="100" Text="{Binding FirstName, Mode=TwoWay, ValidatesOnExceptions=true}"&gt;&lt;/TextBox&gt;</p> <p>Мы добавили простое свойство <strong>ValidatesOnException</strong>. Чтобы посмотреть на его работу, запустите приложение и введите неверные данные. Поле ввода будет выделено красной рамкой, а при наведении фокуса Вы увидете сообщение, которое заключено в исключении.</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight33_6A89/image_2.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight33_6A89/image_2.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight33_6A89/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight33_6A89/image_thumb.png" width="244" height="52"></a> </p> <p>Второй механизм позволяет написать код в ответ на исключение при связывании. Для этого изменим TextBox следующим образом:</p> <p>&lt;TextBox Width="100" Text="{Binding FirstName, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" BindingValidationError="TextBox_BindingValidationError" x:Name="textBox1"&gt;&lt;/TextBox&gt;</p> <p>Тут мы описали обработчик специального события <strong>BindingValidationError</strong>, а также указали свойство <strong>NotifyOnValidationError</strong>, которое говорит о необходимости генерации этого события.</p> <p>А вот и код обработчика:</p> <p>private void TextBox_BindingValidationError(object sender, ValidationErrorEventArgs e) <br>{ <br>&nbsp;&nbsp;&nbsp; textBox1.Focus(); <br>}</p> <p>Тут мы просто устанавливаем фокус на наше поле, чтобы дополнительно пивлечь внимание пользователя и заставить его исправить ошибку.</p> <p>Все, холод таки вреден. А тут еще и снегопад жуткий. Может и не доберусь уже до Интернета, никогда.... Попробую выпить кофе и пойти на встречу. Продолжение следует.</p>]]></content:encoded>
    </item>
    <item>
      <title>SilverLight 3: Что нового? (часть 2)</title>
      <link>https://docs.microsoft.com/archive/blogs/sbaidachni/silverlight-3-2</link>
      <pubDate>Thu, 19 Mar 2009 03:36:18 GMT</pubDate>
      <dc:creator><![CDATA[sbaidachni]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sbaidachni/2009/03/19/silverlight-3-2/</guid>
      <description><![CDATA[На прошлой неделе со мной произошло большое несчастье. Приехав в Киев в субботу ночью, я обнаружил,...]]></description>
      <content:encoded><![CDATA[<p>На прошлой неделе со мной произошло большое несчастье. Приехав в Киев в субботу ночью, я обнаружил, что забыл блок питания от лаптопа в Днепропетровске. Как назло в офисе чистили ковры и никого не пускали. Поэтому на воскресенье я остался без лаптопа. В результате этого несчастья я обнаужил, что в Киеве тоже есть супермаркеты, а у меня в квартире несколько кастрюль и плита. Закончил я готовить ровно тогда, когда еда перестала помещаться в холодильник. Теперь можно есть месяц. Вот как раз сейчас я доел очередной кусок курицы, закусил бутербродом с салом и могу приступить ко второй части своей статьи. Поскольку я все еще еду в Минск, то очень трясет, поэтому без ошибок не обойтись.</p> <p><strong>SaveFileDialog</strong></p> <p>В предыдущих версиях SilverLight Вы могли общаться с файловой системой только через <strong>OpenFileDialog</strong>. Это вызывало много нареканий от разработчиков, так как при отображении текстовой информации пользователь не имел возможности сохранить ее на локальный диск. Это же касалось различных графических редакторов и т. д. Теперь разработчик имеет возможность записать на диск любую информацию и в любое место, используя возможности <strong>SaveFileDialog</strong>. Смотрим пример:</p> <p>SaveFileDialog file= new SaveFileDialog(); <br>file.Filter = "Text File | *.txt"; <br>file.DefaultExt = ".txt"; <br>file.ShowDialog(); </p> <p>if (file.File.Name != "") <br>{ <br>&nbsp;&nbsp;&nbsp;&nbsp; System.IO.StreamWriter s = <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new System.IO.StreamWriter(file.OpenFile()); <br>&nbsp;&nbsp;&nbsp;&nbsp; s.Write("Hello"); <br>&nbsp;&nbsp;&nbsp;&nbsp; s.Close(); <br>}</p> <p>Этот код можно разместить в любом методе интерфейсного потока. В результате работы кода, пользователю будет предложено выбрать папку для записи и имя файла (по умолчанию .txt). В файл будет записано Hello. Ничего сложного.</p> <p><strong>Поддержка ToolTip</strong></p> <p>Следующий интересный элемент управления, это ToolTip. Он может быть привязан к любому <strong>UIElement</strong> и содержать практически любой контент для отображения. Привязку к элементу можно выполнять, как указав свойство <strong>PlacementTarget</strong>, так и использовав этот элемент в качестве части контента. Ниже показан код, который позволяет отобразить ToolTip для кнопки. В качестве контента тут используется видео-файл:</p> <p>&lt;Button Content="Detach" Width="100" Click="Button_Click"&gt; <br>&nbsp; &lt;ToolTipService.ToolTip&gt; <br>&nbsp;&nbsp;&nbsp; &lt;ToolTip Placement="Right"&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ToolTip.Content&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;MediaElement Source="4.wmv"&gt;&lt;/MediaElement&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ToolTip.Content&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/ToolTip&gt; <br>&nbsp; &lt;/ToolTipService.ToolTip&gt; <br>&lt;/Button&gt;</p> <p>ToolTip может быть привязан к одной из границ элемента или к координатам курсора мыши. Привязка задается с помощью свойства <strong>Placement</strong>.</p> <p><strong>CaretBrush</strong></p> <p>Еще одной небольшой особенностью SilverLight 3 является возможность установки каретки для текстового поля и поля для задания пароля (<strong>TextBox</strong> <strong>PasswordBox</strong>). Дело в том, что элементы в SilverLight реализуются таким образом, что представление отделено от логики. Поэтому разработчик может всегда заменить внешний вид уже существующего элемента. Например, можно создать треугольную кнопку или овальное поле для ввода данных. Но в элементах <strong>TextBox</strong> и <strong>PasswordBox</strong> одна часть не поддавалась изменениям - каретка. Она была исключительно черной. Даже, если разработчик просто меня цвет поля ввода, каретку не всегда было видно. Теперь ситуация изменилась. Теперь каретка может использовать любую из доступных кистей для заливки. Разработчик может просто поменять цвет, а может и установить видеоролик в качестве каретки. Вот пример использования свойства:</p> <p>&lt;TextBox Text="Text" CaretBrush="Blue"&gt;&lt;/TextBox&gt; <br>&lt;TextBox Text="Text" &gt; <br>&nbsp;&nbsp;&nbsp; &lt;TextBox.CaretBrush&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;LinearGradientBrush StartPoint="0,0" EndPoint="0,1"&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;GradientStop Color="Yellow" Offset="0.0" /&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;GradientStop Color="Red" Offset="0.25" /&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;GradientStop Color="Blue" Offset="0.75" /&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;GradientStop Color="LimeGreen" Offset="1.0" /&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/LinearGradientBrush&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/TextBox.CaretBrush&gt; <br>&nbsp;&nbsp;&nbsp; &lt;TextBox.RenderTransform&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ScaleTransform ScaleX="3" ScaleY="3"/&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/TextBox.RenderTransform&gt; <br>&lt;/TextBox&gt;</p> <p><strong>Множественный выбор в ListBox</strong></p> <p>Поскольку как-то так получилось, что мы начали вести речь об элементах управления, рассмотрим еще один, уже знакомый элемент - <strong>ListBox</strong>. Тут появилось свойство <strong>SelectionMode</strong>. Это свойство может содержать одно из трех значений: <strong>Single</strong>, <strong>Multiple</strong>, <strong>Extended</strong>. При установке свойства <strong>Multiple</strong> пользователь может выбирать несколько значений, простым кликом, а при выборе <strong>Extended</strong> также доступны функциональные клавиши и поведение больше похоже на полюбившийся ListBox из Forms или WPF.</p> <p>&lt;ListBox x:Name="listBox1" SelectionMode="Extended" SelectionChanged="ListBox_SelectionChanged"&gt; <br>&nbsp;&nbsp;&nbsp; &lt;ListBox.Items&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListBoxItem Content="Item 1"&gt;&lt;/ListBoxItem&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListBoxItem Content="Item 2"&gt;&lt;/ListBoxItem&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListBoxItem Content="Item 3"&gt;&lt;/ListBoxItem&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListBoxItem Content="Item 4"&gt;&lt;/ListBoxItem&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/ListBox.Items&gt; <br>&lt;/ListBox&gt; <br>&lt;TextBlock x:Name="textBox1"&gt;&lt;/TextBlock&gt;</p> <p>private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) <br>{ <br>&nbsp;&nbsp;&nbsp; textBox1.Text = String.Format("{0} items selected",listBox1.SelectedItems.Count); <br>}</p> <p>На этом я на сегодня закончу, так как очень хочу спать. Завтра напишу что-то еще.</p>]]></content:encoded>
    </item>
    <item>
      <title>SilverLight 3: Что нового? (часть 1)</title>
      <link>https://docs.microsoft.com/archive/blogs/sbaidachni/silverlight-3-1</link>
      <pubDate>Thu, 19 Mar 2009 03:34:22 GMT</pubDate>
      <dc:creator><![CDATA[sbaidachni]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sbaidachni/2009/03/19/silverlight-3-1/</guid>
      <description><![CDATA[В то время, как в Лас-Вегасе открывается конференция MIX09, я еду в поезде в сторону Минска, где...]]></description>
      <content:encoded><![CDATA[<p>В то время, как в Лас-Вегасе открывается конференция MIX09, я еду в поезде в сторону Минска, где планирую сделать первый доклад о технологии SilverLight 3. К тому моменту, как я сойду с поезда, подключусь в Интернет и опубликую эту статью, Вы уже должны иметь возможность загрузить этот продукт из сети в версии Beta 1. Кроме того, если Вы не смогли попасть в Лас-Вегас (может мы едем в одном поезде), то сможете получить доступ к записанным видео-трансляциям с конференции в течении следующих 24 часов. Именно по этой причине я не решаюсь дать краткий обзор возможностей SilverLight 3, а сразу перейду к написанию кода, сосредоточившись лишь на некоторых аспектах (пока меня не отвлекут таможенники с вопросом "Что везете? Сервелат? 3 ящика? А колбасу нужно сдать.").</p> <p>Итак,...</p> <p><strong>3D проекции</strong></p> <p>Естественно, что реализовать механизм полноценного 3D движка в плагине размером 4-6 Мб достаточно тяжело. Между тем псевдо 3D позволяет реализовать множество различных сценариев, но требует от разработчика значительное количество усилий. Благодаря элементу <strong>PlaneProjection</strong> в SilverLight 3 разработчик может стоить простые проекции, указав всего несколько параметров. Рассмотрим простой код, отображающий <strong>MediaElement</strong>:</p> <p>&lt;UserControl x:Class="SilverlightApplication30.MainPage" <br>&nbsp;&nbsp;&nbsp; xmlns="<a href="https://schemas.microsoft.com/winfx/2006/xaml/presentation" ?="?">https://schemas.microsoft.com/winfx/2006/xaml/presentation"</a> <br>&nbsp;&nbsp;&nbsp; xmlns:x="<a href="https://schemas.microsoft.com/winfx/2006/xaml" ?="?">https://schemas.microsoft.com/winfx/2006/xaml"</a>&gt; <br>&nbsp;&nbsp;&nbsp; &lt;StackPanel x:Name="LayoutRoot" Background="White" VerticalAlignment="Center"&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;MediaElement Source="4.wmv" Width="500" Height="300"&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;MediaElement.Projection&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;PlaneProjection x:Name="projection" RotationY="60"&gt;&lt;/PlaneProjection&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/MediaElement.Projection&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/MediaElement&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/StackPanel&gt; <br>&lt;/UserControl&gt;</p> <p>В результате мы получим <strong>MediaElement</strong> "повернутый" на 60 градусов по оси Y.</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3_8836/image_2.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3_8836/image_2.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3_8836/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3_8836/image_thumb.png" width="244" height="198"></a> </p> <p>Тут мы использовали элемент <strong>PlaneProjection</strong> с атрибутом <strong>RotationY</strong>. Логично, что если Вы хотите развернуть изображение по другим осям, то нужно воспользоваться атрибутами (свойствами) <strong>RotationX</strong>, <strong>RotationZ</strong>. Элемент <strong>PlaneProjection</strong> можно использовать по отношению к любому из элементов-наследников от <strong>UIElement</strong>.</p> <p>Добавим к нашему коду 4 слайдера, чтобы изменять угол вращения по запросу пользователя:</p> <p>&lt;UserControl x:Class="SilverlightApplication30.MainPage" <br>&nbsp;&nbsp;&nbsp; xmlns="<a href="https://schemas.microsoft.com/winfx/2006/xaml/presentation" ?="?">https://schemas.microsoft.com/winfx/2006/xaml/presentation"</a> <br>&nbsp;&nbsp;&nbsp; xmlns:x="<a href="https://schemas.microsoft.com/winfx/2006/xaml" ?="?">https://schemas.microsoft.com/winfx/2006/xaml"</a>&gt; <br>&nbsp;&nbsp;&nbsp; &lt;StackPanel x:Name="LayoutRoot" Background="White" VerticalAlignment="Center"&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;MediaElement Source="4.wmv" Width="500" Height="300"&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;MediaElement.Projection&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;PlaneProjection x:Name="projection" &gt;&lt;/PlaneProjection&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/MediaElement.Projection&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/MediaElement&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Slider Width="588" Minimum="0" Maximum="360" Value="{Binding RotationX, Mode=TwoWay, ElementName=projection}"&gt;&lt;/Slider&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Slider Width="588" Minimum="0" Maximum="360" Value="{Binding RotationY, Mode=TwoWay, ElementName=projection}"&gt;&lt;/Slider&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Slider Width="588" Minimum="0" Maximum="360" Value="{Binding RotationZ, Mode=TwoWay, ElementName=projection}"&gt;&lt;/Slider&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Slider Width="588" Minimum="0" Maximum="300" Value="{Binding LocalOffsetZ, Mode=TwoWay, ElementName=projection}"&gt;&lt;/Slider&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/StackPanel&gt; <br>&lt;/UserControl&gt;</p> <p>В этом примере мы воспользовались еще одним свойством <strong>LocalOffsetZ</strong>. Свойства <strong>LocalOffsetX</strong>, <strong>LocalOffsetY</strong>, <strong>LocalOffsetZ</strong> позволяют разместить объект в трехмерном пространстве. Как пример использования этих свойств можно рассмотреть "карусель", где все объекты кроме одного расположны на некотором удалении. Кроме этих свойств существуют еще свойства <strong>GlobalOffsetX</strong>, <strong>GlobalOffsetY</strong>, <strong>GlobalOffsetZ</strong>. Разница между ними только в том, что первые устанавливают смещение относительно текущего контейнера, а вторые - относительно всего окна.</p> <p>Последние свойства, которые могут быть интересны разработчику, это <strong>CenterOfRotationX</strong>, <strong>CenterOfRotationY</strong>, <strong>CenterOfRotationZ</strong>. Позволяют задать точку, вокруг которой проводить вращение.</p> <p>О! Мы тронулись и ко мне в шкафчик пришел какой-то бородатый мужик. Мужик - не девушка, поэтому я еще смогу не отвлекаться. Кроме того, он говорит только по английски. Сделаю вид, что я не есть понимать.</p> <p><strong>Offline работа</strong></p> <p>Следующая интересная возможность - установка SilverLight приложения в локальный кэш пользователя с возможностью запуска в режиме, отключенном от сети. </p> <p>Для того, чтобы установить приложение в кэш на машине пользователя, необходимо выполнить два шага:</p> <p>1). Вызвать метод <strong>Detach</strong> у объекта <strong>Application</strong>. При этом данный метод должен быть вызван только из обработчика события, инициируемого пользователем. Например, событие может быть связано с нажатием на кнопку.</p> <p>Добавим кнопку в предыдущий XAML файл.</p> <p>&lt;Button Content="Detach" Width="100" Click="Button_Click"&gt;&lt;/Button&gt;</p> <p>Разместите кнопку сразу после последнего элемента Slider. </p> <p>Обработчик нажатия на кнопку будет выглядеть так:</p> <p>private void Button_Click(object sender, RoutedEventArgs e) <br>{ <br>&nbsp;&nbsp;&nbsp; Application.Current.Detach(); <br>}</p> <p>2). Добавить несколько элементов в манифест приложения. Эти элементы необходимы в первую очередь для того, чтобы предоставить дополнительные параметры, которые нужны при развертывании приложения на клиент (надписи, иконки). Вот как будет выглядеть наш манифест:</p> <p>&lt;Deployment xmlns="<a href="https://schemas.microsoft.com/client/2007/deployment" ?="?">https://schemas.microsoft.com/client/2007/deployment"</a> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:x="<a href="https://schemas.microsoft.com/winfx/2006/xaml" ?="?">https://schemas.microsoft.com/winfx/2006/xaml"</a>&gt; <br>&nbsp;&nbsp;&nbsp; &lt;Deployment.Parts&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/Deployment.Parts&gt; <br>&nbsp;&nbsp;&nbsp; &lt;Deployment.ApplicationIdentity&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ApplicationIdentity <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShortName="Offline App" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Title="My Title"&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ApplicationIdentity.Blurb&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This is my offline App <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ApplicationIdentity.Blurb&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ApplicationIdentity&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/Deployment.ApplicationIdentity&gt; <br>&lt;/Deployment&gt;</p> <p>Если Вы хотите также описать и иконки, то добавьте следующий элемент:</p> <p>&lt;ApplicationIdentity.Icons&gt; <br>&nbsp;&nbsp; &lt;Icon Size="16x16"&gt;icons/16x16.png&lt;/Icon&gt; <br>&nbsp;&nbsp; &lt;Icon Size="32x32"&gt;icons/32x32.png&lt;/Icon&gt; <br>&nbsp;&nbsp; &lt;Icon Size="48x48"&gt;icons/48x48.png&lt;/Icon&gt; <br>&nbsp;&nbsp; &lt;Icon Size="128x128"&gt;icons/128x128.png&lt;/Icon&gt; <br>&lt;/ApplicationIdentity.Icons&gt;</p> <p></p> <p>Если иконки явно не указаны, то подставляется иконка по умолчанию.</p> <p>Теперь можно запустить приложение и нажать на кнопку. На экране появится следующее сообщение:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3_8836/image_4.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3_8836/image_4.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/sbaidachni/WindowsLiveWriter/SilverLight3_8836/image_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/sbaidachni/WindowsLiveWriter/SilverLight3_8836/image_thumb_1.png" width="244" height="108"></a>&nbsp; </p> <p>Итак, пользователь выбирает, где он хочет видеть иконку своего приложения и должен нажать ОК для установки приложения в кэш. Нужн отметить, что для установки приложения в кэш пользователь НЕ должен обладать административными правами.</p> <p>Для удаления приложения пользователь должен инициировать вызов контекстного меню (раньше можно было вызвать только SilverLight Configuration) и выбрать <strong>Remove This Application</strong>. При этом команда доступна вне зависимости от того запустил пользователь локальную версию или воспользовался браузером.</p> <p>Работая с приложение в отключенном режиме программист имеет возможность определять метод запуска приложения, а также реагировать на изменение метода запуска. Во-первых в объекте <strong>Application</strong> всегда доступно свойство <strong>ExecutionState</strong>, через которое можно получить значение перечислимого типа <strong>ExecutionStates</strong>. Последнее может содержать следующие значения: <strong>Detached</strong>, <strong>DetachedUpdatesAvailable</strong>, <strong>DetachedFailed</strong>, <strong>Detaching</strong>, <strong>RunningOnline</strong>. Во-вторых, есть возможность реагировать на событие приложения <strong>Application_ExecutionStateChanged</strong>. </p> <p>Работая в отключенном режиме, разработчик может определить состояние подключения. Это может быть очень полезно при реализации механизма синхронизации данных. Проверить соединение можно с помощью вот этого статического метода: <strong>NetworkInterface.GetIsNetworkAvailable().</strong> Обращаю Ваше внимание на то, что класс <strong>NetworkInterface</strong> находится в пространстве имен<strong> System.Net.NetworkInformation</strong>.</p> <p><strong>Обновление приложения в разъединенном окружении</strong></p> <p>Что же происходит, если приложение было обновлено в сети? Оказывается приложение автоматически проверяет, доступны ли обновления. Это происходит сразу после того, как приложение обнаружило доступ в сеть. Если обновления обнаружены, то они тут же начинают загружаться в кэш пользователя, после чего происходит событие <strong>ExecutionStateChanged</strong>. Обработав это событие, можно нотифицировать пользователя о том, что обновление уже доступно и ему нужно перезапустить приложение. Какой-либо возможности управлять загрузкой обновлений или отключить эту функциональность (ключи в реестре не считаются) - нет.</p> <p><strong>Реакция на изменение сетевого интерфейса</strong></p> <p>Оказывается, что оперативно определять разрыв связи с сетью можно с помощью реакции на статическое событие <strong>NetworkAddressChanged</strong>, которое описано в классе <strong>NetworkChange</strong>. Это событие происходит всякий раз, когда с сетевым интерфейсом что-то происходит. Далее задача программиста воспользоваться методом <strong>GetIsNetworkAvailable</strong>, чтобы понять, есть ли соединение.</p> <p>Вот и все, что можно на текущий момент сказать об отключенном режиме. Принесли чай, поэтому я завершаю эту короткую статью и начинаю искать свои бутерброды.</p>]]></content:encoded>
    </item>
    <item>
      <title>Deep Dive курсы по технологии SilverLight (Симферополь, Харьков)</title>
      <link>https://docs.microsoft.com/archive/blogs/sbaidachni/deep-dive-silverlight-1087</link>
      <pubDate>Mon, 02 Mar 2009 03:42:30 GMT</pubDate>
      <dc:creator><![CDATA[sbaidachni]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sbaidachni/2009/03/02/deep-dive-silverlight-1087/</guid>
      <description><![CDATA[Мы запустили цикл курсов по SilverLight 2. Курс расчитан на 2 дня и уже можно зарегистрироваться для...]]></description>
      <content:encoded><![CDATA[<p>Мы запустили цикл курсов по SilverLight 2. Курс расчитан на 2 дня и уже можно зарегистрироваться для Симферополя и Харькова.</p> <p>Вот ссылки:</p> <p><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032406250&amp;Culture=UK-UA">https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032406250&amp;Culture=UK-UA</a> <p><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032406251&amp;Culture=UK-UA">https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032406251&amp;Culture=UK-UA</a>]]></content:encoded>
    </item>
    <item>
      <title>Последние доклады с Дней разработчиков</title>
      <link>https://docs.microsoft.com/archive/blogs/sbaidachni/113</link>
      <pubDate>Sat, 28 Feb 2009 07:03:17 GMT</pubDate>
      <dc:creator><![CDATA[sbaidachni]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sbaidachni/2009/02/28/113/</guid>
      <description><![CDATA[Опубликовал новое видео с наших ежемесячных событий. Даю прямые ссылки для скачивания: Создание...]]></description>
      <content:encoded><![CDATA[<p>Опубликовал новое видео с наших ежемесячных событий.</p> <p>Даю прямые ссылки для скачивания:</p> <p><a href="https://silverlight.services.live.com/52153/Workflow_In_Sharepoint_Kosinskiy/video.wmv" target="_blank">Создание Workflow в Microsoft Office SharePoint Server 2007 - Константин Косинский</a></p> <p><a href="https://silverlight.services.live.com/52153/SharePointForDevelopers_Lomakin/video.wmv" target="_blank">Введение в Microsoft Office SharePoint Server 2007 для разработчиков - Александр Ломакин</a></p> <p><a href="https://silverlight.live.com/Video.aspx?setName=BIInSharePoint_Kosinskiy" target="_blank">Business Intelligence в Microsoft Office Sharepoint Server 2007 - Константин Косинский</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>