<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=2894509</guid>
        <pubDate>Sun, 15 May 2011 10:33:29 +0000</pubDate>
        <title>Введение в WPF</title>
        <link>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=2894509</link>
        <description><![CDATA[resource: thanks<br>
некоторые моменты стали более ясны<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>ДА, знать всего нельзя, но спуститься в низ, иногда бывает полезно, подругому начинаешь смотреть на вещи.</div></div><br>
ну... после Win32 API это совсем не кажется низами...]]></description>
        <author>resource</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=2231770</guid>
        <pubDate>Mon, 30 Mar 2009 21:06:30 +0000</pubDate>
        <title>Введение в WPF</title>
        <link>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=2231770</link>
        <description><![CDATA[Flanker: Добрый день. <br>Полезная статья, по себе знаю.<br>Когда, люди начинают, програмировать UI  в какой нибудь IDE, достигают какого-то хорошего уровня <br>создания приложений.<br> После чего начинают задавать такие вопросы, &quot;Как динамически можно создать кнопки на форме?&quot;.<br> ДА, знать всего нельзя, но спуститься в низ, иногда бывает полезно, подругому начинаешь смотреть на вещи.<br><br>Спасибо.]]></description>
        <author>Flanker</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=2228548</guid>
        <pubDate>Thu, 26 Mar 2009 10:42:56 +0000</pubDate>
        <title>Введение в WPF</title>
        <link>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=2228548</link>
        <description><![CDATA[juice: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=222778&view=findpost&p=2227874'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>John&#045;Desperado &#064; <time class="tag-quote__quoted-time" datetime="2009-03-25T12:15:57+00:00">25.03.09, 12:15</time></span><div class='quote '>Почему при закрытии win1 у меня закроется все приложение, а при закрытии win2 только win2. Хотя я явно указал что win2 - главное окно.</div></div><br>
Потому, что твое окно win2 живет самостоятельной жизнью вне нормального жизненного цикла приложения. В коллекции Windows у Application имеется одно единственное окно, которое win1, т.к дефолтная стратегия предпологает закрытие приложение по принципу &quot;после уничтожения последнего&quot;. Приложение закрывается именно после закрытия win1. Что бы убедиться в том, что окну не нужен Application для того, что бы себе отобразаить достаточно удалить все упоминания Application, а в конце метода поставить Thread.Sleep(...);]]></description>
        <author>juice</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=2227874</guid>
        <pubDate>Wed, 25 Mar 2009 12:15:57 +0000</pubDate>
        <title>Введение в WPF</title>
        <link>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=2227874</link>
        <description><![CDATA[John-Desperado: Вопросо по данной теме. Читал вроде внимательно, но не понял. <br>
<br>
Почему при закрытии win1 у меня закроется все приложение, а при закрытии win2 только win2. Хотя я явно указал что win2 - главное окно.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Window win1 = new Window();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;win1.Title = &quot;Fisrt window&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Window win2 = new Window();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;win2.Title = &quot;Second window&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;win2.Show();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Application app = new Application();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;app.MainWindow = win2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;app.Run(win1);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>John-Desperado</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=1864129</guid>
        <pubDate>Mon, 11 Feb 2008 08:01:31 +0000</pubDate>
        <title>Введение в WPF</title>
        <link>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=1864129</link>
        <description><![CDATA[juice: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=222778&view=findpost&p=1864043'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Alexus &#064; <time class="tag-quote__quoted-time" datetime="2008-02-11T05:40:20+00:00">11.02.08, 05:40</time></span><div class='quote '>Будешь издавать книжки малыми тиражами и все будут за ними охотиться...<br>
Станешь вторым Рихтером  </div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=222778&view=findpost&p=1864043'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Alexus &#064; <time class="tag-quote__quoted-time" datetime="2008-02-11T05:40:20+00:00">11.02.08, 05:40</time></span><div class='quote '>Вот щас натренруешься на нас - потом издаваться будешь.</div></div><br>
Ну кто бы говорил... :))))<br>
Большими<strong class='tag-b'>Alexus</strong>, большими :)]]></description>
        <author>juice</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=1864043</guid>
        <pubDate>Mon, 11 Feb 2008 05:40:20 +0000</pubDate>
        <title>Введение в WPF</title>
        <link>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=1864043</link>
        <description><![CDATA[Alexus: Вот щас натренруешься на нас - потом издаваться будешь.<br>Будешь издавать книжки малыми тиражами и все будут за ними охотиться...<br>Станешь вторым Рихтером ;)]]></description>
        <author>Alexus</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=1863958</guid>
        <pubDate>Sun, 10 Feb 2008 21:06:53 +0000</pubDate>
        <title>Введение в WPF</title>
        <link>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=1863958</link>
        <description><![CDATA[juice: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=222778&view=findpost&p=1863930'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ZOXEXIVO &#064; <time class="tag-quote__quoted-time" datetime="2008-02-10T20:14:00+00:00">10.02.08, 20:14</time></span><div class='quote '>Рейтинг свой поднять хочешь?) </div></div><br>
Так сложилось, что с понедельника по пятницу я разработчик, а по субботам педагог :) Иногда, выходит так, что не чем занять себя в воскресенье :) (шутка, про воскресенье шутка) Некоторые люди пишут стихи, считай это аналогичной потребностью.]]></description>
        <author>juice</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=1863930</guid>
        <pubDate>Sun, 10 Feb 2008 20:14:00 +0000</pubDate>
        <title>Введение в WPF</title>
        <link>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=1863930</link>
        <description><![CDATA[ZOXEXIVO: Рейтинг свой поднять хочешь?)]]></description>
        <author>ZOXEXIVO</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=1863826</guid>
        <pubDate>Sun, 10 Feb 2008 15:50:54 +0000</pubDate>
        <title>Введение в WPF</title>
        <link>https://forum.sources.ru/index.php?showtopic=222778&amp;view=findpost&amp;p=1863826</link>
        <description><![CDATA[juice: Целью, ряда планируемых статей, которые надеюсь, будут представлены Вашему вниманию,  является изучение WPF , но не в буквальном понимании  этой фразы, их целью является попытка осветить собственные поиски и изыскания на пути изучения тех или иных составляющих, новой библиотеки от Microsoft.  На мое твердое убеждение, достичь успеха при изучении какой-либо новой технологии позволяет комплексный подход, который состоит из двух принципов. Первый и самый главный принцип  -  практика. Только проектируя и разрабатывая настоящие приложения можно добиться прогресса и почерпнуть практические знания. Вторая важная составляющая это всестороннее исследование изучаемого предмета. Именно на исследовании и теоретических аспектах я и попытаюсь сконцентрировать свое внимание в своих обзорах библиотеки. Разве не интересно залезть под капот этому новому «заморскому» чудищу?&#33;  К тому же второй принцип позволяет подвести под практическую основу отличную теоретическую базу. Кто-то спросит, а зачем? И окажется по-своему прав. Ну,  хотя бы для того, что бы иногда правильно отвечать на вопросы ньюбов  на форуме sources.ru. Это, конечно же, была шутка. Основной лейтмотив, - без теории никогда не бывает практики. Любой попытке написать код с использованием не знакомой технологии или библиотеки, предшествует хотя бы беглый просмотр типов данных которые она предоставляет. Иногда предшествует чтение статей из серии “Getting Started”. Самое интересное, что читают обычно все и матерые профессионалы, и зеленые новички.<br>
<br>
Сегодняшний очерк ставит собой цель получить работоспособное оконное WPF приложение написанное руками, без использования мастера. Кому то этого покажется мало, но я обещаю Вам, что скучно не будет даже тем, кто уже начал изучать WPF&#33; Кроме написания простого приложения мы подробно рассмотрим типы данных, которыми оно оперирует, и попробуем посмотреть чуть-чуть глубже, чем обычные статьи из серии «Взять Старт».<br>
<br>
Первое, что мы с Вами сделаем, - создадим, пустой проект, используя среду MS Visual Studio 2008. Для этого в меню File среды разработки выбираем пункт  New – Project переходим в раздел C# - Windows и выбираем шаблон Empty Project. Даем ему имя HelloWPF, при этом не забываем указать, что собираемся использовать Framework 3.5<br>
Давайте добавим в наш проект файл с именем HelloWPF, для этого нам нужно в Solution explorer выбрать наш проект и в контекстном  меню выбрать Add – New Item, после чего указать, что добавлять мы будем файл с исходным кодом (Сode File).<br>
<br>
Пока файл пуст. Что требуется для того, что бы превратить его в программу? Правильно класс, содержащий статический метод Main, который является отправной точкой, для любой программы, написанной на языке C#. Поторопимся и мы с Вами, добавив следующий код:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">using System;</div><div class="code_line">&nbsp;</div><div class="code_line">namespace Juice.HelloWPF</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;public class HeloWPF</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public static void Main()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Можно скомпилировать код и выполнить его (Ctrl – F5), на экране мы увидим стандартную  консоль.<br>
<br>
Что же нам потребуется, что бы превратит консоль в полноценное оконное WPF приложение? Совсем немного, немного - терпения. Прежде всего давайте выясним, какие сборки нам с Вами необходимы для разработки WPF программ? Основной функционал содержится в трех сборках это:  PresentationCore, PresentationFramework и WindowsBase. Так же джентльменский набор потребует хорошо известной всем нам сборки System. Добавим их к проекту. В Solution Explorer, выбираем Reference – Add Reference, выделяем их в появившимся списке и жмем кнопку Ok. Теперь нам с Вами доступны все необходимые для корректной работы приложения типы. Какие же из них нам понадобятся для написания наипростейшего приложения? Прежде всего, это тип Application находящийся в namespace  System.Windows сборки PresentationFramework, данный класс представляет собой абстракцию нашего приложения. Он обязательно необходим нашему приложению, что бы оно могло обрабатывать сообщения, поступающие от операционной системы. Это могут быть события, которые генерируются в ответ на действия пользователя или события, поступающие от устройств ввода-вывода и.т.д. Позже мы узнаем,  что класс Application предоставляет нам с вами множество дополнительных возможностей, которые позволят нам более полно контролировать выполнение нашей программы.  Приложение должно иметь один и только один объект Application.  Давайте добавим его в наш код.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">using System;</div><div class="code_line">using System.Windows;</div><div class="code_line">&nbsp;</div><div class="code_line">namespace Juice.HelloWPF</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;public class HeloWPF</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public static void Main()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Application app = new Application();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
После компиляции программы мы увидим уже знакомую нам с Вами консоль. Для создания полноценного оконного приложения нам с Вами не хватает – окна&#33; Класс представляющий в WPF окно, находится по уже знакомому нам с Вами адресу, в namespace  System.Windows сборки PresentationFramework и называется он, как это не удивительно  Window.  Давайте, скорее добавим и его в нашу программу:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">using System;</div><div class="code_line">using System.Windows;</div><div class="code_line">&nbsp;</div><div class="code_line">namespace Juice.HelloWPF</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;public class HeloWPF</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public static void Main()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Application app = new Application();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Window window = new Window();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Пробуем выполнить наше приложение … Упс. Что то пошло не так, мы получили сообщение об ошибке The calling thread must be STA, because many UI components require this. И это произошло при попытке инициализации объекта Window.<br>
<br>
Дело не хитрое и легко поправимое, путем добавления атрибута STAThread методу Main. Этим мы устанавливаем исходную модель потоков для основного потока приложения при взаимодействии с COM подсистемой.  Стоит заметить, что наличие этого атрибута обязательно для любой WPF программы. Особо любопытных могу отправить по следующему адресу http://blogs.msdn.com/larryosterman/archive/2004/04/28/122240.aspx где очень и очень подробно описано значение STAThread в COM модели и не только это. Меня же заинтересовала, возможность посмотреть стектрейс.  Также стало интересно, какое именно место привело к выбросу исключения, в нашей программе. Стектрейс может много нам рассказать о происходящем в момент инстанцирования экземпляра окна и мне бы хотелось узнать об этом  также больше. Рассмотрим  стектрейс исключения подробней, часть текста которого приведен ниже:<br>
<br>
at System.Windows.Input.InputManager..ctor()<br>
   at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()<br>
   at System.Windows.Input.InputManager.get_Current()<br>
   at System.Windows.Input.KeyboardNavigation..ctor()<br>
   at System.Windows.FrameworkElement.EnsureFrameworkServices()<br>
   at System.Windows.FrameworkElement..ctor()<br>
   at System.Windows.Controls.Control..ctor()<br>
   at System.Windows.Window..ctor()<br>
<br>
Мы видим, что вызов конструктора Window,  привел к вызову цепочки конструкторов базовых классов в его иерархии: Control и FrameworkElement. Здесь следует уточнить, что Window наследует непосредственно классу ContentControl, но о нем, вероятно, мы поговорим в следующих обзорах. <br>
<br>
Для полноты картины представлю дерево наследования для класса Window:<br>
<br>
Object<br>
DispatcherObject<br>
DependencyObject<br>
Visual<br>
UIElement<br>
FrameworkElement<br>
Control<br>
ContentControl<br>
Window<br>
<br>
В конструкторе  FrameworkElement , как мы видим дальше, был произведен вызов закрытого статического метода EnsureFrameworkServices. <br>
<br>
   <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>at System.Windows.FrameworkElement.EnsureFrameworkServices()</div></div><br>
<br>
который, судя по своему названию, гарантирует поддержку служб библиотеки для экземпляров FameworkElement. Что за службы такие? На самом деле все гораздо более прозаично. FrameworkElement содержит закрытую статическую переменную, относящуюся к типу FrameworkServise.  Этот тип  обеспечивает навигацию по элементам управления с использованием клавиатуры. Второй обязаностью класса FrameworkServise есть обеспечение поддержки  для тултипов. Для этого он создает экземпляр класса PopupControlService. Просмотрев стектрейс еще выше, мы как раз и увидим, что в методе EnsureFrameworkServices происходит инициализация переменной типа KeyboardNavigation.  <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>at System.Windows.Input.KeyboardNavigation..ctor()</div></div><br>
<br>
KeyboardNavigation объявлен как внутренняя (internal) переменная FrameworkServise. На этот класс библиотекой WPF возлагается обязанность по обработке навигационных клавиш, а также клавиатурных сокращений связанных с навигацией. Сам же FrameworkElement, предоставляет статическое свойство с одноименным названием KeyboardNavigation, посредством которого наследники получают к нему доступ. Для выполнения своих обязанностей KeyboardNavigation использует класс InputManager. Ссылку, на который и пытается получить в своем конструкторе.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
   at System.Windows.Input.InputManager.get_Current()</div></div><br>
<br>
 Если бы ссылка была получена успешно, то  KeyboardNavigation подписался бы на пару событий объявленных в InputManager и благополучно закончил бы свою инициализацию. Но на момент создания окна приложения InputManager не инициализирован, о чем свидетельствует  вызов его конструктора. <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>at System.Windows.Input.InputManager..ctor()</div></div><br>
<br>
Посредсвом InputManager приложение (и даже мы ;) можем получить широкий доступ к вводимым пользователем данным. Именно так и поступает KeyboardNavigation. Приложение может получить ссылку на  единственный экземпляр InputManager. Класс InputManager реализован как Singleton. Конструктор этого класса, в соответствии с шаблоном объявлен как приватный. Если Вы, захотите воспользоваться этим  классом в вашей собственной программе, то его следует инстанцировать следующим образом:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;InputManager manager = InputManager.Current;</div></ol></div></div></div></div><br>
<br>
И так, что мы имеем? Исключение было сгенерировано при инициализации переменной типа InputManager. Именно в ее конструкторе находится условный блок, который проверяет текущую модель потоков COM на соответствие STAThread. Причем делается это посредством обычного вызова метода GetApartmentState для текущего исполняемого потока приложения и последующим сравнением полученного значения с значением STA перечисления ApartmentState. После успешной проверки, на «наличие атрибута» , InputManager  подключает  устройства ввода, которые может обработать подсистема ввода WPF,  такие как клавиатура, мышь и стилус, в противном же случае бросает уже знакомое нам исключение. Ну, что двинемся дальше? Ведь теперь мы, по крайней мере, «лучше знаем», что делает WPF, создавая окно.<br>
<br>
Метод Run имеет перегруженную версию, которая принимает парамметром объект Window, благодаря чему нашу программу можно написать на строчку короче.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">using System;</div><div class="code_line">using System.Windows;</div><div class="code_line">&nbsp;</div><div class="code_line">namespace Juice.HelloWPF</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;public class HeloWPF</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;[STAThread]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public static void Main()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Window window = new Window(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Application app = new Application();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;app.Run(window);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Результат идентичен.<br>
<br>
Думаю, что не трудно догадаться, что метод Run получая окно самостоятельно вызыавет метод Show полученого экземпляра Window. Казалось бы цель нашего тура выполнена, минимальное приложение для WPF компилируется и выполняется, но мне бы хотелось еще немного поговорить о классе  Application, что бы сложилась законченая картина функционала который он нам может предоставить. Вернемся к вопросу о том, когда же закончится выполнение метода Run. Для этого слегка модифицируем код нашего приложения:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">using System;</div><div class="code_line">using System.Windows;</div><div class="code_line">&nbsp;</div><div class="code_line">namespace Juice.HelloWPF</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;public class HeloWPF</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;[STAThread]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public static void Main()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Window window = new Window();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;window.Title = &quot;First&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Window windowSecond = new Window();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;windowSecond.Title = &quot;Second&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;windowSecond.Show();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Application app = new Application();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;app.Run(window);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Результатом программы является вывод обеих окон, после закрытия окна First приложение завершает свою работу. В тоже время закрытие окна Second не приводит к такому результату. Почему? Дело в том, что Application считает одно из окон главным. По умолчанию это окно передаваемое Application в качестве парамметра и обычно это будет первое создаваемое приложением окно. Можем ли мы вообще повлиять на этот процесс? Можно ли назначить приложению другое главное окно? Оказывается да. У класса приложения есть волшебное свойство которое мы с Вами, можем установить, ShutdownMode. Оно может принимать одно из трех значений: ShutdownMode.OnLastWindowClose, ShutdownMode.OnMainWindowClose и ShutdownMode.OnExplicitShutdown. Установка первого говорит приложению, что методу Run стоит выполнять работу пока существует хотя бы одно окно которое он может обслуживать. Второе значение говорит методу Run, что ему следует завершить работу когда пользователь закроет главное окно. Последнее из указанных значений, говорит о том, что приложение может завершить свою работу только явно посредством вызова метода Shutdown() класса Application. Давайте разберемся в том, что происходит при вызове следующей строчки кода: <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">app.Run(window);</div></ol></div></div></div></div><br>
<br>
<br>
Первое, что делает метод Run проверяет выполняется ли он в нужном потоке, далее следует проверка на то, что приложение выполняется  не в броузере. У класса Application имется коллекция объектов Windows в которой метод Run ищет передаваемое ему окно и если не находит добавляет его в коллекцию. Далее  следует проверка на наличие у приложения главного окна и если такое не установлено, то метод Run делает полученное окно – главным. В дальнейшем проводится проверка является ли окно видимым и если нет вызывается метод Show окна. После чего запускается цикл обработки сообщений. И так мы узнали о двух интересных свойствах объекта Application это Windows, которое хранит коллекцию окон приложения и MainWindow которое возвращает ссылку на главное окно приложения. При этом ни, что нам не мешает присвоить свойству MainWindow другое значение. Мы можем сделать главным любое другое окно по нашему усмотрению. Оба этих свойства можно без проблем задействовать в собственной программе. Если посмотреть на методы и события класса Application можно найти еще несколько интерессных  событий и свойств:<br>
Startup – событие которое позволяет отследить начло работы нашего приложения, здесь удобно инициализировать данные уровня приложения.<br>
<br>
Exit – событие которое извещает о завершении работы приложения, здесь удобно будет совершить действия по сохранению глобальных для приложения данных, перед окончанием его работы или выполнить другую необходимую логику.<br>
<br>
SessionEnding – событие которое позволяет нам отследить завершение сеанса работы пользователя в Windows или выключение компьютера.<br>
<br>
Activated – событие которое отрабатывает когда  пользователь переключается на работу с одним из окон нашего приложения<br>
<br>
Diactivated – отрабатывает когда приложение становится неактивным, в результате того, что пользователь переключился на работу с другим приложением.<br>
<br>
DispatcherUnhandledException – срабатывает при возникновении в приложении необработанного исключения.<br>
<br>
Из свойств хочеться вделить Properties который является ассоциативным контейнером (хеш-таблицей), который содержит пары ключ-значение, где мы можем сохранять собственные данные уровня приложения. Резонен вопрос, как получить к этой коллекции из кода в приложении? Все очень просто. Я уже говорил, что класс Application может быть только один в программе и получить ссылку на него можно используя статическое свойство класса Application, Сurrent.<br>
<br>
На последок можно отметить, что отключить консоль проще простого, для этого достаточно в свойствах проекта изменить тип приложения с Console на WindowsApplication. Но при изучении новых технологий, а также на этапе отладки консоль выглядит удобным помошником.<br>
<br>
Надеюсь каждый узнал для себя сегодня, что то новое. До новых встреч.]]></description>
        <author>juice</author>
        <category>.NET FAQ</category>
      </item>
	
      </channel>
      </rss>
	