Silverlight и WPF в Visual Studio 2010
TextFormattingMode и TextRenderingMode
Теперь мы можем действительно управлять тем, как будет отрисовываться текст. Для этого нам предоставили два свойства TextOptions.TextFormattingMode и TextOptions.TextRenderingMode. Первому можно установить Ideal – текст будет выглядеть как обычно в WPF, или Display – будет выглядеть как текст GDI. Display советуют применять только с мелким текстом, в остальных случаях оставить как есть. Разница в чтении мелкого текста заметна (рис. 6.5):
Так же новый стек поддерживает явно выбираемые режимы прорисовки текста: aliased, grayscale, ClearType. Новый текстовый стек позволяет оптимизировать текстовую привязку для анимации и статики. Вдобавок, новый текстовый стек поддерживает шрифты с встроенными картами изображений, что позволяет многим восточно-азиатским шрифтам прорисовываться с чёткостью, к которой привыкли пользователи Win32.
XAML
Built in Types
В XAML добавилась возможность использовать стандартные типы .NET в разметке без указания лишних namespace, для чего это стало нужно, видно в нижеописанных возможностях. Если раньше для описания в XAML объекта типа string приходилось писать:
<s:String xmlns:s="clr-namespace:System;assembly=mscorlib"> Foo </s:String>
Теперь же
<x:String > Foo </x:String>
Поддержка Generics
Этого давно не хватало, а именно с выпуска первого 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>
FactoryMethod\Arguments
Еще одна возможность, которую хотели уже давно. Возможность использовать методы для инициализации объектов, а также конструкторы, которые принимают параметры. Для того, чтобы создать объект такого типа:
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>
Named Object References
Тут все просто, такой биндинг:
<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>
Binding to Dynamic Objects
.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.
Node Loop flexibility
Как известно в .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\Gesture Binding
Появилась возможность биндить 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 Development Environment) — система программных средств, используемая программистами для разработки программного обеспечения.
IntelliSense — технология автодополнения Microsoft, наиболее известная в Microsoft Visual Studio. Дописывает название функции при вводе начальных букв. Кроме прямого назначения IntelliSense используется для доступа к документации и для устранения неоднозначности в именах переменных, функций и методов, используя рефлексию.
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 ориентирована на визуальное программирование и использует декларативную модель программирования.
Шейдер (англ. Shader) — это программа для одной из ступеней графического конвейера, используемая в трёхмерной графике для определения окончательных параметров объекта или изображения. Она может включать в себя произвольной сложности описание поглощения и рассеяния света, наложения текстуры, отражение и преломление, затенение, смещение поверхности и эффекты пост-обработки.
Краткие итоги
Как видно из вышеизложенного, появилось масса нововведений в WPF 4.0. Можно сказать, что WPF — это одно из ведущих направлений Windows-приложений. Со временем WPF превратится в систему, подобную User32 и GDI/GDI+, к которой будут добавляться новые расширения и высокоуровневые средства. В конечном итоге WPF позволит проектировать приложения, которые было бы невозможно (или, по крайней мере, непрактично) построить средствами Windows Forms.
Набор для практики
Вопросы:
- Назовите основные нововведения Visual Studio 2010 касающиеся разработки WPF/Silverlight приложений.
- Перечислите новые средства WPF 4.
- Назначение клиентского профиля.
- Назовите новые и доработанные графикические возможности WPF 4
- Ключевые улучшения WPF 4 для XAML