Опубликован: 13.12.2011 | Доступ: свободный | Студентов: 1021 / 34 | Оценка: 4.29 / 4.57 | Длительность: 13:56:00
Лекция 4:

Silverlight и WPF в Visual Studio 2010

TextFormattingMode и TextRenderingMode

Теперь мы можем действительно управлять тем, как будет отрисовываться текст. Для этого нам предоставили два свойства TextOptions.TextFormattingMode и TextOptions.TextRenderingMode. Первому можно установить Ideal – текст будет выглядеть как обычно в WPF, или Display – будет выглядеть как текст GDI. Display советуют применять только с мелким текстом, в остальных случаях оставить как есть. Разница в чтении мелкого текста заметна (рис. 6.5):

Демонстрация работы свойств TextOptions.TextFormattingMode

Рис. 6.5. Демонстрация работы свойств TextOptions.TextFormattingMode

Так же новый стек поддерживает явно выбираемые режимы прорисовки текста: 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.

Набор для практики

Вопросы:

  1. Назовите основные нововведения Visual Studio 2010 касающиеся разработки WPF/Silverlight приложений.
  2. Перечислите новые средства WPF 4.
  3. Назначение клиентского профиля.
  4. Назовите новые и доработанные графикические возможности WPF 4
  5. Ключевые улучшения WPF 4 для XAML