Цель лекции: рассмотреть новые средства WPF версии 4. Показать какая поддержка появилась в Microsoft Visual Studio 2010 для удобства и эффективного программирования с применением технологии WPF.
WPF история становления
WPF 4 — относительно новая технология. Частично она входила в несколько выпусков .NET и постепенно совершенствовалась.
Первая версия WPF вышла вместе с двумя другими технологиями: Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF). Все вместе это называлось .NET 3.0.
Год спустя, вышла новая версия WPF, как часть .NET Framework 3.5. Новые средства WPF в основном были слегка усовершенствованы, включая исправление ошибок и повышение производительности.
Когда вышел пакет обновлений .NET Framework Service Pack 1 (SP1), проектировщики WPF получили возможность добавить некоторые новые средства, подобные сглаженной графике (благодаря построителям текстуры) и изощренному элементу управления DataGrid.
В последнем выпуске WPF появилось множество улучшений, включая ценные новые средства, построенные на базе существующей инфраструктуры WPF. Среди некоторых наиболее заметных изменений — улучшенная визуализация текста, более естественная анимация и поддержка средств Windows 7, таких как сенсорные возможности и новая панель задач.
Вся "обстановка" в IDE реализована на WPF. Буквально все рамки и украшения документа, и служебные окна являются частью "визуального дерева" (Visual Tree) WPF. В него включены главное меню, панели инструментов, контекстные меню и панель статуса. Документ в целом - по сути, вся система управления окном - тоже WPF, включая оверлейные слои, которые появляются при перетаскивании окон. Обновленная стартовая страница (Start Page) также полностью реализована на WPF и, при желании, Вы можете написать свою собственную замену стартовой странице на XAML. Новый редактор текста, который был создан с нуля с использованием WPF. Использование WPF в редакторе открывает для разработчиков возможности усовершенствования редактора путем создания впечатляющих расширений написанием всего нескольких строк кода. Несколько других часто используемых текстовых окон, такие, как "Вывод даннах" (Output) и "Cписок найденного" (Find Results List) также базируются на новом текстовом редакторе.
Небольшой, но важной функцией для Visual Studio является возможность создания основного окна WPF, не показывая его. Он используется в ситуациях, когда Visual Studio создается программно, например, в режиме "Design Time Extensibility" или при сборке приложения в режиме командной строки.
Для взаимодействия с меню и панелями инструментов с клавиатуры в Visual Studio использует новую функцию WPF "режим меню" (MenuMode). Она позволяет перенаправить сообщения в меню или панель инструментов без "кражи" фокуса ввода у активного в данный момент элемента. Без этой функции некоторые сценарии в Visual Studio было бы невозможно осуществить на практике с использованием WPF.
В прошлом каждая версия Visual Studio была тесно привязана к определенной версии .NET. Версия Visual Studio 2010 свободна от этого ограничения и позволяет проектировать приложения, ориентированные на любую версию .NET— от 2.0 до 4. Хотя очевидно невозможно создать приложение WPF для .NET 2.0, в версиях .NET 3.0 и 3.5 поддержка WPF имеется. Выбор в качестве целевой платформы .NET 3.0 обеспечивает наиболее широкую совместимость (т.к. приложения .NET 3.0 могут работать под управлением исполняющих сред .NET 3.0, 3.5 и 4). Выбор в качестве целевой платформы .NET 3.5 или .NET 4 открывает доступ к новейшим средствам WPF, имеющимся в .NET.
При создании нового проекта в Visual Studio можно выбирать целевую версию .NET Framework в раскрывающемся списке, который расположен в верхней части диалогового окна New Project (Новый проект) прямо над списком шаблонов проектов (рис. 6.1).
(рис 6.1) Выбор целевой версии .NET Framework
Целевую версию можно изменить в любой момент позже, дважды щелкнув на узле Properties (Свойства) в окне Solution Explorer (Проводник решения) и изменив выбор в списке Target Framework (
Для обеспечения аккуратной поддержки множества
Как ни странно, доступны два способа выбрать в качестве цели WPF 4. Первый способ — построить приложение, которое требует стандартной установки полной платформы .NET Framework 4. Второй способ — построить приложение, которому требуется .NET Framework 4 Client Profile (Клиентский профиль .NET Framework 4).
Клиентский профиль — это подмножество .NET Framework, которое требуется многофункциональным клиентским приложениями вроде WPF. Сюда не входят средства серверной стороны, такие как ASP.NET, отладчики, средства разработки, компиляторы кода и унаследованные средства (подобные поддержке баз данных Oracle). Более важно то, что клиент имеет меньший размер, требуя загрузки около 30 Мбайт, в то время как полный комплект распространения .NET Framework занимает около 100 Мбайт. Естественно, если приложение ориентировано на .NET Framework 4 Client Profile, оно без проблем будет работать под управлением полной версии .NET Framework. Концепция клиентского профиля появилась в .NET 3.5 SP1. Однако в ней по-прежнему присутствуют несколько моментов, которые мешают ей стать стандартом. В .NET 4 были проведены работы по тонкой настройке средств, включаемых в комплект клиентского профиля, предполагая сделать его стандартным выбором для любого приложения. В Visual Studio 2010 большинство проектов автоматически нацелены на .NET Framework 4 Client Profile. (Именно это вы получаете, выбирая .NET Framework 4 в диалоговом окне New Project.) Изменив настройку Target Framework (
При выборе целевой версии .NET часто важно учитывать, насколько широко распространены различные исполняющие среды в настоящее время. В идеале пользователи должны иметь возможность запускать приложения, не требуя дополнительного шага по загрузке и установке. Ниже дано несколько советов, которые помогут принять правильное решение:
Несмотря на тот факт, что Visual Studio является важнейшим инструментом для программирования с применением WPF, в предыдущих версиях был существенный пробел в доступных возможностях — они не предлагали графического визуального конструктора для создания пользовательского интерфейса. В результате разработчики были вынуждены писать код XAML вручную либо переключаться между Visual Studio и более ориентированным на дизайн инструментом Expression Blend. В Visual Studio 2010, наконец, этот недостаток был восполнен за счет появления мощного визуального конструктора для создания пользовательских интерфейсов WPF.
Однако тот факт, что Visual Studio 2010 позволяет легко перетаскивать окна WPF на поверхность проектирования, не означает, что это нужно делать прямо сейчас или вообще когда-либо. Visual Studio может помочь в этом, но будет намного легче, если первым делом освоить основы разметки XAML и компоновки WPF. Это позволит впоследствии просматривать код разметки, сгенерированный Visual Studio, и при необходимости модифицировать его вручную.
Часть профессиональных разработчиков используют Visual Studio, часть — Expression Blend, есть те, кто пишет код XAML вручную, а есть те, кто применяет комбинацию перечисленных методов с последующим конфигурированием в визуальном конструкторе Visual Studio.
Семейство элементов WPF продолжает расти. Теперь оно включает профессионально выглядящий DataGrid, стандартные DataPicker и Calendar и встроенный WebBrowser для просмотра HTML-разметки и веб-серфинга. Отдельная загрузка также добавляет полезный элемент управления
Впервые появившийся в Silverlight, диспетчер визуального состояния облегчает изменение обложек элементов управления без необходимости понимания их внутреннего устройства и работы.
С представлением мультитач ввода и поддержки манипулированием обработки, WPF 4 предоставляет отличный способ добавить пикантности в ваше клиентское приложение в Windows 7. Появились новые события манипуляции и инерции:
Чтобы начать работать с
Теперь запросто можно добавлять поддержку всех красивостей и удобностей от Windows 7 в приложение. Для этого нам нужно обратиться к пространству имен System.Windows.Shell и посмотреть, что же он нам предлагает.
Он предлагает управляемую обертку для Taskbar в среде Windows 7. У класса Window появилось свойство (dependency) TaskbarItemInfo, которому и необходимо установить объект типа TaskbarItemInfo (можно как в XAML - декларативно, так и программно). При помощи свойства ThumbnailClipMargin можно установить, какая часть окна будет отображена в Preview окна на taskbar (показывается при наведении, если включено Aero), то есть можно отображать не все окно, а, например, только значимую необходимую часть. Более того TaskbarItemInfo позволяет отобразить функциональные клавиши в том же Preview (ThumbButtonInfos), а также отобразить какой-нибудь свой элемент над иконкой на Taskbar (Overlay), и состояние длительного процесса (ProgressValue и ProgressState). На рис. 6.2 вы можете видеть как будет это выглядеть (пример с MSDN)
(рис 6.2) Применение TaskbarItemInfo
Тут все просто, он может в себя включать либо JumpTask, либо JumpPath, первый может задавать программу с набором аргументов, второй путь до файла.
Полезное дополнение, но так как в основном мы все программируем для корпоративных клиентов, то на него нужно смотреть как на возможность дополнения функциональности приложения, если у пользователя стоит Windows 7. Так, если мы как-то отображаем долгий процесс, то почему бы и не отобразить его при помощи TaskbarItemInfo в дополнение: тогда играющий в косынку менеджер всегда сможет заметить, когда программа закончила формировать отчет или выполнила какую либо задачу. Но вот вынести часто используемые файлы просто в JumpList не достаточно, так как мы ограничим пользователей, которые используют более ранние версии Windows, а о них тоже стоит подумать.
В предыдущих версиях окна выбора файлов, директорий и т.п. выглядели в стиле WinXP, теперь же окна полностью соответствуют ОС, в которой запущено приложение, а точнее диалоги выбора файлов в Windows 7 выглядят, как в Windows 7.
В WPF, как вы знаете, есть поддержка проверки правописания SpellCheck. А может и не знаете, потому что поддерживаются только 4 языка: английский, немецкий, испанский и французский, и расширить это никак нельзя. В WPF 4.0 появилась возможность заводить Custom Dictionary, чтобы добавлять всяческие слова, вроде
Как и должно быть: новый WPF и поддержка новых шейдеров, теперь поддерживаются шейдеры версии 3.0. Опять же, нужно не забывать, что существуют компьютеры и без поддержки шейдеров версии 3.0 – для этого введен дополнительный набор методов для определения версии шейдеров, поддерживаемых системой, в классе RenderCapability. В сети достаточно примеров написанных эффектов, один из них был Grayscale эффект, который из цветной фотографии делал ч/б – использовали в проекте для toolbar’a – все иконки делали ч/б, и только при наведении они приобретали цвет (позаимствовали идею у Photoshop).
С графикой также связаны нововведения, которые позволят повысить производительность наших приложений. Теперь у класса UIElement есть свойство Cachemode, которому мы можем установить объект типа BitmapCache. Полезно это будет, в основном, когда ваше приложение использует множество элементов, описанных декларативно при помощи Path, тогда вы можете задать
<Canvas.Cachemode>
<BitmapCache EnableClearType="False"
RenderAtScale="1"
SnapsToDevicePixels="False"/>
</Canvas.Cachemode>
Проще некуда, осталось только найти места в приложениях, где это может повысить производительность. Также знакомимся с классом BitmapCacheBrush, который также должен нам значительно повысить производительность приложения при должном использовании. Он нам понадобится в случае, если мы какой-то элемент отображаем несколько раз в одном окне. Например, это может быть иконка в DataGridView: теперь ее один раз можно отрендерить, сделать
Следующим нововведением в WPF является LayoutRounding. Новое в WPF, но уже старое в Silverlight. Сложно ответить чем UseLayoutRounding лучше SnapsToDevicePixels. Вообще идея двух этих свойств разная, но эффект иногда получается один и тот же, но в разработке лучше привязываться к Layout Rounding и использовать только его, он более интуитивно понятен. Более подробную информацию можно получить здесь: http://blogs.msdn.com/b/text/archive/2009/08/27/layout-rounding.aspx.
Дискретная, линейная и сплайновая анимация уже поддерживается предыдущими версиями WPF. WPF 4 представляет новый концепт "Easing Functions", которые позволяют разработчикам создавать различную анимацию. Например, пружинистые движения или добавить упреждение в анимацию. Функции упрощения (Easing Functions) определяют способ анимации от начала и до конца. Встроенные функции упрощения предоставляют спектр режимов в анимации: круговой, экспоненциальной, эластичной и пружинистой. Функции упрощения спроектированы легко расширяемыми, позволяя разработчикам создавать собственные. Благодаря данному нововведения, дизайнеры могут без усилий создавать плавную и органичную анимацию.
Теперь визуальное представление каждого элемента может быть радикально изменено посредством эффектов в духе PhotoShop — через построители текстур. Разработчики, которые желают манипулировать индивидуальными пикселями вручную, могут также генерировать и модифицировать изображения с помощью класса WriteableBitmap.
Теперь у каретки и для выделения можно задать кисти:
<TextBox FontSize="24" CaretBrush="Green" SelectionOpacity="0.1"
SelectionBrush="Red">
Hello, Hello, Hello
</TextBox>
И получить результат, который изображен на рис. 6.3
(рис 6.3) Эффект применения CaretBrush и SelectionBrush
Очередная заклепка в WPF – свойство RenderOptions.ClearTypeHint. Идея в следующем, если в вашем визуальном дереве на каком-то шаге используется, например, Opacity, то все визуальное дерево ниже уровнем будет прорисовывать текст без
(рис 6.4) Эффект свойства RenderOptions.ClearTypeHint
Другим примером может быть, если вы у Grid'а будете использовать свойство Clip. Свойством RenderOptions.ClearTypeHint можно задать Enabled – для того, чтобы текст все-таки прорисовался с
Теперь мы можем действительно управлять тем, как будет отрисовываться текст. Для этого нам предоставили два свойства TextOptions.TextFormattingMode и TextOptions.TextRenderingMode. Первому можно установить Ideal – текст будет выглядеть как обычно в WPF, или Display – будет выглядеть как текст GDI. Display советуют применять только с мелким текстом, в остальных случаях оставить как есть. Разница в чтении мелкого текста заметна (рис. 6.5):
(рис 6.5) Демонстрация работы свойств TextOptions.TextFormattingMode
Так же новый стек поддерживает явно выбираемые режимы прорисовки текста:
В XAML добавилась возможность использовать стандартные типы .NET в разметке без указания лишних namespace, для чего это стало нужно, видно в нижеописанных возможностях. Если раньше для описания в XAML объекта типа string приходилось писать:
<s:String xmlns:s="clr-namespace:System;assembly=mscorlib"> Foo </s:String>
Теперь же
<x:String > Foo </x:String>
Этого давно не хватало, а именно с выпуска первого WPF. Как часто хотелось объявить в XAML ObservableCollection с типом вроде Person, а для этого нам приходилось создавать новый тип и наследовать его от коллекции, либо инкапсулировать ее:
class PersonCollection:ObservableCollection<Person>{}
и уже этот новый класс объявлять в ресурсах:
<l:PersonCollection>
<Person Name="Tom" />
</l:PersonCollection>
Теперь же этого можно избежать, теперь в XAML можно объявлять и инициализировать generics следующим образом:
<ObservableCollection
x:TypeArguments='local:Person'
xmlns='clr-namespace:System.Collections.ObjectModel;assembly=System' >
<local:Person Name='Tom' Age='21' />
</ObservableCollection>
Еще одна возможность, которую хотели уже давно. Возможность использовать методы для инициализации объектов, а также конструкторы, которые принимают параметры. Для того, чтобы создать объект такого типа:
public class Person
{
public Person (string name, int age)
{
Name = name;
Age = age;
}
public string Name {get;set;}
public int Age {get;set;}
}
В XAML теперь можно написать
<local:Person>
<x:Arguments>
<x:String>Tom</x:String>
<x:Int32>21</x:Int32>
</x:Arguments>
</local:Person>
Более того, для создания объекта теперь можно использовать FactoryMethod, самый простой пример – это Guid.NewGuid():
<p:Guid x:FactoryMethod='NewGuid'/>
Или более сложный пример с передачей параметров:
<coll:List x:Key='list' x:TypeArguments='x:String'
x:FactoryMethod='local:Factory.CreateStringList'>
<x:Arguments>
<x:String>Mickey,Donald</x:String>
</x:Arguments>
</coll:List>
Тут все просто, такой биндинг:
<Label Target='{Binding ElementName=firstNameBox}' >_Target</Label>
<TextBox Name='firstNameBox'>Uses Binding</TextBox>
Теперь можно записать при помощи x:Reference
<Label Target= '{x:Reference secondNameBox}'>_Second Target</Label>
Или даже так:
<Label Target= 'thirdNameBox' >_Third Target</Label>
.NET 4 приходит вместе с dynamic, потому и в WPF добавили возможность биндить к свойствам dynamic объектов. Если мы установим такие свойства у объекта:
dynamic dynamicObj = BindPanel.DataContext ;
dynamicObj.A = "Simple Binding";
dynamicObj.B = new DynamicObjectClass();
dynamicObj.B.C = "Nested Prop Binding";
dynamicObj.AddItem("item 0");
dynamicObj[0] = "Indexer Binding";
То мы запросто можем установить такой биндинг:
<StackPanel Name="BindPanel" DataContext="{StaticResource MyDynamicObject}">
<TextBox Text="{Binding Path=A}"/>
<TextBlock Text="{Binding Path=B.C}" />
<TextBox Text="{Binding Path=[(x:Int32)0]}"/>
</StackPanel>
Эта возможность тоже даст пищу для размышлений. Теперь можно придумать о быстрой реализации биндинга к DataSet или XMLDocument.
Как известно в .NET 4 появилась отдельная библиотека System.Xaml, позволяющая нам обрабатывать Xaml разметку, считывать и превращать в граф объектов. Раньше у нас была возможность так же работать с Xaml разметкой при помощи XamlReader и XamlWriter, но все что они нам давали – это считывать и записывать Xaml, но не предоставляли нам возможность работать с ним. Теперь же набор классов для работы с Xaml пополнился, например, XamlXmlReader, который позволяет пробегаться еще и по элементам xaml дерева. Пример можно посмотреть здесь http://blogs.msdn.com/b/llobo/archive/2009/11/09/ xaml-2009-features-node-loop-flexibility.aspx, в данном примере у считываемого Xaml файла заменяют родительский элемент Window на Page.
Появилась возможность биндить Key и Modifiers в KeyBinding. Теперь можно создать свою DelegateCommand со свойствами
public Key GestureKey { get; set; }
public ModifierKeys Gesturemodifier { get; set; }
public MouseAction MouseGesture { get; set; }
Инициализировать команду следующим образом
public ICommand ExitCommand
{
get
{
if (exitCommand == null)
{
exitCommand = new DelegateCommand(Exit);
exitCommand.GestureKey = Key.X;
exitCommand.Gesturemodifier = ModifierKeys.Control;
exitCommand.MouseGesture = MouseAction.LeftDoubleClick;
}
return exitCommand;
}
}
А дальше забиндить клавиши:
<Window.InputBindings>
<KeyBinding Command="{Binding ExitCommand}"
Key="{Binding ExitCommand.GestureKey}"
Modifiers="{Binding ExitCommand.Gesturemodifier}"/>
</Window.InputBindings>
Без необходимости объявления ресурсов.
GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие как мониторы и принтеры.
IDE (англ. Integrated
IntelliSense — технология автодополнения Microsoft, наиболее известная в Microsoft Visual Studio. Дописывает название функции при вводе начальных букв. Кроме прямого назначения
Windows Communication Foundation (WCF) — программный фреймворк, используемый для обмена данными между приложениями входящими в состав .NET Framework. До своего выпуска в декабре 2006 года в составе .NET Framework 3.0, WCF был известен под кодовым именем Indigo.
Windows Workflow Foundation (WF) представляет собой технологию компании Microsoft для определения, выполнения и управления рабочими процессами (англ. workflow). Данная технология входит в состав .NET Framework 3.0, который изначально установлен в Windows Vista и может быть установлен в Windows 2003 Server и Windows XP SP2. WF ориентирована на визуальное программирование и использует
Шейдер (англ.
Как видно из вышеизложенного, появилось масса нововведений в WPF 4.0. Можно сказать, что WPF — это одно из ведущих направлений Windows-приложений. Со временем WPF превратится в систему, подобную User32 и
Вопросы:
Цель лекции: рассмотреть новые средства WPF версии 4. Показать какая поддержка появилась в Microsoft Visual Studio 2010 для удобства и эффективного программирования с применением технологии WPF.
WPF история становления
WPF 4 — относительно новая технология. Частично она входила в несколько выпусков .NET и постепенно совершенствовалась.
Первая версия WPF вышла вместе с двумя другими технологиями: Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF). Все вместе это называлось .NET 3.0.
Год спустя, вышла новая версия WPF, как часть .NET Framework 3.5. Новые средства WPF в основном были слегка усовершенствованы, включая исправление ошибок и повышение производительности.
Когда вышел пакет обновлений .NET Framework Service Pack 1 (SP1), проектировщики WPF получили возможность добавить некоторые новые средства, подобные сглаженной графике (благодаря построителям текстуры) и изощренному элементу управления DataGrid.
В последнем выпуске WPF появилось множество улучшений, включая ценные новые средства, построенные на базе существующей инфраструктуры WPF. Среди некоторых наиболее заметных изменений — улучшенная визуализация текста, более естественная анимация и поддержка средств Windows 7, таких как сенсорные возможности и новая панель задач.
Вся "обстановка" в IDE реализована на WPF. Буквально все рамки и украшения документа, и служебные окна являются частью "визуального дерева" (Visual Tree) WPF. В него включены главное меню, панели инструментов, контекстные меню и панель статуса. Документ в целом - по сути, вся система управления окном - тоже WPF, включая оверлейные слои, которые появляются при перетаскивании окон. Обновленная стартовая страница (Start Page) также полностью реализована на WPF и, при желании, Вы можете написать свою собственную замену стартовой странице на XAML. Новый редактор текста, который был создан с нуля с использованием WPF. Использование WPF в редакторе открывает для разработчиков возможности усовершенствования редактора путем создания впечатляющих расширений написанием всего нескольких строк кода. Несколько других часто используемых текстовых окон, такие, как "Вывод даннах" (Output) и "Cписок найденного" (Find Results List) также базируются на новом текстовом редакторе.
Небольшой, но важной функцией для Visual Studio является возможность создания основного окна WPF, не показывая его. Он используется в ситуациях, когда Visual Studio создается программно, например, в режиме "Design Time Extensibility" или при сборке приложения в режиме командной строки.
Для взаимодействия с меню и панелями инструментов с клавиатуры в Visual Studio использует новую функцию WPF "режим меню" (MenuMode). Она позволяет перенаправить сообщения в меню или панель инструментов без "кражи" фокуса ввода у активного в данный момент элемента. Без этой функции некоторые сценарии в Visual Studio было бы невозможно осуществить на практике с использованием WPF.
В прошлом каждая версия Visual Studio была тесно привязана к определенной версии .NET. Версия Visual Studio 2010 свободна от этого ограничения и позволяет проектировать приложения, ориентированные на любую версию .NET— от 2.0 до 4. Хотя очевидно невозможно создать приложение WPF для .NET 2.0, в версиях .NET 3.0 и 3.5 поддержка WPF имеется. Выбор в качестве целевой платформы .NET 3.0 обеспечивает наиболее широкую совместимость (т.к. приложения .NET 3.0 могут работать под управлением исполняющих сред .NET 3.0, 3.5 и 4). Выбор в качестве целевой платформы .NET 3.5 или .NET 4 открывает доступ к новейшим средствам WPF, имеющимся в .NET.
При создании нового проекта в Visual Studio можно выбирать целевую версию .NET Framework в раскрывающемся списке, который расположен в верхней части диалогового окна New Project (Новый проект) прямо над списком шаблонов проектов (рис. 6.1).
(рис 6.1) Выбор целевой версии .NET Framework
Целевую версию можно изменить в любой момент позже, дважды щелкнув на узле Properties (Свойства) в окне Solution Explorer (Проводник решения) и изменив выбор в списке Target Framework (
Для обеспечения аккуратной поддержки множества
Как ни странно, доступны два способа выбрать в качестве цели WPF 4. Первый способ — построить приложение, которое требует стандартной установки полной платформы .NET Framework 4. Второй способ — построить приложение, которому требуется .NET Framework 4 Client Profile (Клиентский профиль .NET Framework 4).
Клиентский профиль — это подмножество .NET Framework, которое требуется многофункциональным клиентским приложениями вроде WPF. Сюда не входят средства серверной стороны, такие как ASP.NET, отладчики, средства разработки, компиляторы кода и унаследованные средства (подобные поддержке баз данных Oracle). Более важно то, что клиент имеет меньший размер, требуя загрузки около 30 Мбайт, в то время как полный комплект распространения .NET Framework занимает около 100 Мбайт. Естественно, если приложение ориентировано на .NET Framework 4 Client Profile, оно без проблем будет работать под управлением полной версии .NET Framework. Концепция клиентского профиля появилась в .NET 3.5 SP1. Однако в ней по-прежнему присутствуют несколько моментов, которые мешают ей стать стандартом. В .NET 4 были проведены работы по тонкой настройке средств, включаемых в комплект клиентского профиля, предполагая сделать его стандартным выбором для любого приложения. В Visual Studio 2010 большинство проектов автоматически нацелены на .NET Framework 4 Client Profile. (Именно это вы получаете, выбирая .NET Framework 4 в диалоговом окне New Project.) Изменив настройку Target Framework (
При выборе целевой версии .NET часто важно учитывать, насколько широко распространены различные исполняющие среды в настоящее время. В идеале пользователи должны иметь возможность запускать приложения, не требуя дополнительного шага по загрузке и установке. Ниже дано несколько советов, которые помогут принять правильное решение:
Несмотря на тот факт, что Visual Studio является важнейшим инструментом для программирования с применением WPF, в предыдущих версиях был существенный пробел в доступных возможностях — они не предлагали графического визуального конструктора для создания пользовательского интерфейса. В результате разработчики были вынуждены писать код XAML вручную либо переключаться между Visual Studio и более ориентированным на дизайн инструментом Expression Blend. В Visual Studio 2010, наконец, этот недостаток был восполнен за счет появления мощного визуального конструктора для создания пользовательских интерфейсов WPF.
Однако тот факт, что Visual Studio 2010 позволяет легко перетаскивать окна WPF на поверхность проектирования, не означает, что это нужно делать прямо сейчас или вообще когда-либо. Visual Studio может помочь в этом, но будет намного легче, если первым делом освоить основы разметки XAML и компоновки WPF. Это позволит впоследствии просматривать код разметки, сгенерированный Visual Studio, и при необходимости модифицировать его вручную.
Часть профессиональных разработчиков используют Visual Studio, часть — Expression Blend, есть те, кто пишет код XAML вручную, а есть те, кто применяет комбинацию перечисленных методов с последующим конфигурированием в визуальном конструкторе Visual Studio.
Семейство элементов WPF продолжает расти. Теперь оно включает профессионально выглядящий DataGrid, стандартные DataPicker и Calendar и встроенный WebBrowser для просмотра HTML-разметки и веб-серфинга. Отдельная загрузка также добавляет полезный элемент управления
Впервые появившийся в Silverlight, диспетчер визуального состояния облегчает изменение обложек элементов управления без необходимости понимания их внутреннего устройства и работы.
С представлением мультитач ввода и поддержки манипулированием обработки, WPF 4 предоставляет отличный способ добавить пикантности в ваше клиентское приложение в Windows 7. Появились новые события манипуляции и инерции:
Чтобы начать работать с
Теперь запросто можно добавлять поддержку всех красивостей и удобностей от Windows 7 в приложение. Для этого нам нужно обратиться к пространству имен System.Windows.Shell и посмотреть, что же он нам предлагает.
Он предлагает управляемую обертку для Taskbar в среде Windows 7. У класса Window появилось свойство (dependency) TaskbarItemInfo, которому и необходимо установить объект типа TaskbarItemInfo (можно как в XAML - декларативно, так и программно). При помощи свойства ThumbnailClipMargin можно установить, какая часть окна будет отображена в Preview окна на taskbar (показывается при наведении, если включено Aero), то есть можно отображать не все окно, а, например, только значимую необходимую часть. Более того TaskbarItemInfo позволяет отобразить функциональные клавиши в том же Preview (ThumbButtonInfos), а также отобразить какой-нибудь свой элемент над иконкой на Taskbar (Overlay), и состояние длительного процесса (ProgressValue и ProgressState). На рис. 6.2 вы можете видеть как будет это выглядеть (пример с MSDN)
(рис 6.2) Применение TaskbarItemInfo
Тут все просто, он может в себя включать либо JumpTask, либо JumpPath, первый может задавать программу с набором аргументов, второй путь до файла.
Полезное дополнение, но так как в основном мы все программируем для корпоративных клиентов, то на него нужно смотреть как на возможность дополнения функциональности приложения, если у пользователя стоит Windows 7. Так, если мы как-то отображаем долгий процесс, то почему бы и не отобразить его при помощи TaskbarItemInfo в дополнение: тогда играющий в косынку менеджер всегда сможет заметить, когда программа закончила формировать отчет или выполнила какую либо задачу. Но вот вынести часто используемые файлы просто в JumpList не достаточно, так как мы ограничим пользователей, которые используют более ранние версии Windows, а о них тоже стоит подумать.
В предыдущих версиях окна выбора файлов, директорий и т.п. выглядели в стиле WinXP, теперь же окна полностью соответствуют ОС, в которой запущено приложение, а точнее диалоги выбора файлов в Windows 7 выглядят, как в Windows 7.
В WPF, как вы знаете, есть поддержка проверки правописания SpellCheck. А может и не знаете, потому что поддерживаются только 4 языка: английский, немецкий, испанский и французский, и расширить это никак нельзя. В WPF 4.0 появилась возможность заводить Custom Dictionary, чтобы добавлять всяческие слова, вроде
Как и должно быть: новый WPF и поддержка новых шейдеров, теперь поддерживаются шейдеры версии 3.0. Опять же, нужно не забывать, что существуют компьютеры и без поддержки шейдеров версии 3.0 – для этого введен дополнительный набор методов для определения версии шейдеров, поддерживаемых системой, в классе RenderCapability. В сети достаточно примеров написанных эффектов, один из них был Grayscale эффект, который из цветной фотографии делал ч/б – использовали в проекте для toolbar’a – все иконки делали ч/б, и только при наведении они приобретали цвет (позаимствовали идею у Photoshop).
С графикой также связаны нововведения, которые позволят повысить производительность наших приложений. Теперь у класса UIElement есть свойство Cachemode, которому мы можем установить объект типа BitmapCache. Полезно это будет, в основном, когда ваше приложение использует множество элементов, описанных декларативно при помощи Path, тогда вы можете задать
<Canvas.Cachemode>
<BitmapCache EnableClearType="False"
RenderAtScale="1"
SnapsToDevicePixels="False"/>
</Canvas.Cachemode>
Проще некуда, осталось только найти места в приложениях, где это может повысить производительность. Также знакомимся с классом BitmapCacheBrush, который также должен нам значительно повысить производительность приложения при должном использовании. Он нам понадобится в случае, если мы какой-то элемент отображаем несколько раз в одном окне. Например, это может быть иконка в DataGridView: теперь ее один раз можно отрендерить, сделать
Следующим нововведением в WPF является LayoutRounding. Новое в WPF, но уже старое в Silverlight. Сложно ответить чем UseLayoutRounding лучше SnapsToDevicePixels. Вообще идея двух этих свойств разная, но эффект иногда получается один и тот же, но в разработке лучше привязываться к Layout Rounding и использовать только его, он более интуитивно понятен. Более подробную информацию можно получить здесь: http://blogs.msdn.com/b/text/archive/2009/08/27/layout-rounding.aspx.
Дискретная, линейная и сплайновая анимация уже поддерживается предыдущими версиями WPF. WPF 4 представляет новый концепт "Easing Functions", которые позволяют разработчикам создавать различную анимацию. Например, пружинистые движения или добавить упреждение в анимацию. Функции упрощения (Easing Functions) определяют способ анимации от начала и до конца. Встроенные функции упрощения предоставляют спектр режимов в анимации: круговой, экспоненциальной, эластичной и пружинистой. Функции упрощения спроектированы легко расширяемыми, позволяя разработчикам создавать собственные. Благодаря данному нововведения, дизайнеры могут без усилий создавать плавную и органичную анимацию.
Теперь визуальное представление каждого элемента может быть радикально изменено посредством эффектов в духе PhotoShop — через построители текстур. Разработчики, которые желают манипулировать индивидуальными пикселями вручную, могут также генерировать и модифицировать изображения с помощью класса WriteableBitmap.
Теперь у каретки и для выделения можно задать кисти:
<TextBox FontSize="24" CaretBrush="Green" SelectionOpacity="0.1"
SelectionBrush="Red">
Hello, Hello, Hello
</TextBox>
И получить результат, который изображен на рис. 6.3
(рис 6.3) Эффект применения CaretBrush и SelectionBrush
Очередная заклепка в WPF – свойство RenderOptions.ClearTypeHint. Идея в следующем, если в вашем визуальном дереве на каком-то шаге используется, например, Opacity, то все визуальное дерево ниже уровнем будет прорисовывать текст без
(рис 6.4) Эффект свойства RenderOptions.ClearTypeHint
Другим примером может быть, если вы у Grid'а будете использовать свойство Clip. Свойством RenderOptions.ClearTypeHint можно задать Enabled – для того, чтобы текст все-таки прорисовался с
Теперь мы можем действительно управлять тем, как будет отрисовываться текст. Для этого нам предоставили два свойства TextOptions.TextFormattingMode и TextOptions.TextRenderingMode. Первому можно установить Ideal – текст будет выглядеть как обычно в WPF, или Display – будет выглядеть как текст GDI. Display советуют применять только с мелким текстом, в остальных случаях оставить как есть. Разница в чтении мелкого текста заметна (рис. 6.5):
(рис 6.5) Демонстрация работы свойств TextOptions.TextFormattingMode
Так же новый стек поддерживает явно выбираемые режимы прорисовки текста:
В XAML добавилась возможность использовать стандартные типы .NET в разметке без указания лишних namespace, для чего это стало нужно, видно в нижеописанных возможностях. Если раньше для описания в XAML объекта типа string приходилось писать:
<s:String xmlns:s="clr-namespace:System;assembly=mscorlib"> Foo </s:String>
Теперь же
<x:String > Foo </x:String>
Этого давно не хватало, а именно с выпуска первого WPF. Как часто хотелось объявить в XAML ObservableCollection с типом вроде Person, а для этого нам приходилось создавать новый тип и наследовать его от коллекции, либо инкапсулировать ее:
class PersonCollection:ObservableCollection<Person>{}
и уже этот новый класс объявлять в ресурсах:
<l:PersonCollection>
<Person Name="Tom" />
</l:PersonCollection>
Теперь же этого можно избежать, теперь в XAML можно объявлять и инициализировать generics следующим образом:
<ObservableCollection
x:TypeArguments='local:Person'
xmlns='clr-namespace:System.Collections.ObjectModel;assembly=System' >
<local:Person Name='Tom' Age='21' />
</ObservableCollection>
Еще одна возможность, которую хотели уже давно. Возможность использовать методы для инициализации объектов, а также конструкторы, которые принимают параметры. Для того, чтобы создать объект такого типа:
public class Person
{
public Person (string name, int age)
{
Name = name;
Age = age;
}
public string Name {get;set;}
public int Age {get;set;}
}
В XAML теперь можно написать
<local:Person>
<x:Arguments>
<x:String>Tom</x:String>
<x:Int32>21</x:Int32>
</x:Arguments>
</local:Person>
Более того, для создания объекта теперь можно использовать FactoryMethod, самый простой пример – это Guid.NewGuid():
<p:Guid x:FactoryMethod='NewGuid'/>
Или более сложный пример с передачей параметров:
<coll:List x:Key='list' x:TypeArguments='x:String'
x:FactoryMethod='local:Factory.CreateStringList'>
<x:Arguments>
<x:String>Mickey,Donald</x:String>
</x:Arguments>
</coll:List>
Тут все просто, такой биндинг:
<Label Target='{Binding ElementName=firstNameBox}' >_Target</Label>
<TextBox Name='firstNameBox'>Uses Binding</TextBox>
Теперь можно записать при помощи x:Reference
<Label Target= '{x:Reference secondNameBox}'>_Second Target</Label>
Или даже так:
<Label Target= 'thirdNameBox' >_Third Target</Label>
.NET 4 приходит вместе с dynamic, потому и в WPF добавили возможность биндить к свойствам dynamic объектов. Если мы установим такие свойства у объекта:
dynamic dynamicObj = BindPanel.DataContext ;
dynamicObj.A = "Simple Binding";
dynamicObj.B = new DynamicObjectClass();
dynamicObj.B.C = "Nested Prop Binding";
dynamicObj.AddItem("item 0");
dynamicObj[0] = "Indexer Binding";
То мы запросто можем установить такой биндинг:
<StackPanel Name="BindPanel" DataContext="{StaticResource MyDynamicObject}">
<TextBox Text="{Binding Path=A}"/>
<TextBlock Text="{Binding Path=B.C}" />
<TextBox Text="{Binding Path=[(x:Int32)0]}"/>
</StackPanel>
Эта возможность тоже даст пищу для размышлений. Теперь можно придумать о быстрой реализации биндинга к DataSet или XMLDocument.
Как известно в .NET 4 появилась отдельная библиотека System.Xaml, позволяющая нам обрабатывать Xaml разметку, считывать и превращать в граф объектов. Раньше у нас была возможность так же работать с Xaml разметкой при помощи XamlReader и XamlWriter, но все что они нам давали – это считывать и записывать Xaml, но не предоставляли нам возможность работать с ним. Теперь же набор классов для работы с Xaml пополнился, например, XamlXmlReader, который позволяет пробегаться еще и по элементам xaml дерева. Пример можно посмотреть здесь http://blogs.msdn.com/b/llobo/archive/2009/11/09/ xaml-2009-features-node-loop-flexibility.aspx, в данном примере у считываемого Xaml файла заменяют родительский элемент Window на Page.
Появилась возможность биндить Key и Modifiers в KeyBinding. Теперь можно создать свою DelegateCommand со свойствами
public Key GestureKey { get; set; }
public ModifierKeys Gesturemodifier { get; set; }
public MouseAction MouseGesture { get; set; }
Инициализировать команду следующим образом
public ICommand ExitCommand
{
get
{
if (exitCommand == null)
{
exitCommand = new DelegateCommand(Exit);
exitCommand.GestureKey = Key.X;
exitCommand.Gesturemodifier = ModifierKeys.Control;
exitCommand.MouseGesture = MouseAction.LeftDoubleClick;
}
return exitCommand;
}
}
А дальше забиндить клавиши:
<Window.InputBindings>
<KeyBinding Command="{Binding ExitCommand}"
Key="{Binding ExitCommand.GestureKey}"
Modifiers="{Binding ExitCommand.Gesturemodifier}"/>
</Window.InputBindings>
Без необходимости объявления ресурсов.
GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие как мониторы и принтеры.
IDE (англ. Integrated
IntelliSense — технология автодополнения Microsoft, наиболее известная в Microsoft Visual Studio. Дописывает название функции при вводе начальных букв. Кроме прямого назначения
Windows Communication Foundation (WCF) — программный фреймворк, используемый для обмена данными между приложениями входящими в состав .NET Framework. До своего выпуска в декабре 2006 года в составе .NET Framework 3.0, WCF был известен под кодовым именем Indigo.
Windows Workflow Foundation (WF) представляет собой технологию компании Microsoft для определения, выполнения и управления рабочими процессами (англ. workflow). Данная технология входит в состав .NET Framework 3.0, который изначально установлен в Windows Vista и может быть установлен в Windows 2003 Server и Windows XP SP2. WF ориентирована на визуальное программирование и использует
Шейдер (англ.
Как видно из вышеизложенного, появилось масса нововведений в WPF 4.0. Можно сказать, что WPF — это одно из ведущих направлений Windows-приложений. Со временем WPF превратится в систему, подобную User32 и
Вопросы:
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.