Знакомство с Windows Presentation Foundation

Обновлен: Ноябрь 2007

WPF (Windows Presentation Foundation) ― это система следующего поколения для построения клиентских приложений Windows с визуально привлекательными возможностями взаимодействия с пользователем. С помощью WPF можно создавать широкий спектр как автономных, так и размещенных в веб-обозревателе приложений. В качестве примеров таких приложений можно привести Yahoo! Messenger и New York Times Reader, а также демонстрационное приложение «Contoso Healthcare», показанное на следующем рисунке.

Пример пользовательского интерфейса Contoso Healthcare

Основа WPF ― это независимый от разрешения экрана и основанный на векторной графике механизм оторисовке, который был построен для использования всех преимуществ современного графического оборудования. WPF расширяет эту основу исчерпывающим набором средств разработки приложений, включающих Язык XAML (Extensible Application Markup Language), элементы управления, привязку данных, структуру, графику двухмерный и трехмерный, анимацию, стили, шаблоны, документы, мультимедиа, текст и типографию. WPF включен в Microsoft .NET Framework, так что можно строить приложения, включающие другие элементы библиотеки классов .NET Framework.

Этот обзор предназначен для новичков и рассматривает основные возможности и основные понятия WPF. Опытные разработчики WPF, просмотрев обзор WPF, также могут найти этот обзор полезным.

Aa970268.alert_note(ru-ru,VS.90).gifПримечание.

Сведения о новых и обновленных возможностях WPF в .NET Framework 3.5 см. в разделе Новые возможности в Windows Presentation Foundation 3.5.

В этом разделе содержатся следующие подразделы.

  • Программирование с использованием WPF
  • Разметка и код программной части
  • Приложения
  • Элементы управления
  • Ввод и команды
  • Структура
  • Привязка данных
  • Графика
  • Анимация
  • Мультимедиа
  • Текст и типография
  • Документы
  • Настройка приложений WPF
  • Советы и рекомендации по WPF
  • Сводка
  • Рекомендуемые обзоры и примеры
  • Связанные разделы

Программирование с использованием WPF

WPF существует в качестве подмножества типов .NET Framework, которые занимают большую часть в пространстве имен System.Windows. Если вы ранее создавали приложения с помощью .NET Framework, используя такие управляемые технологии, как ASP.NET и Windows Forms, вы должны быть знакомы с основами программирования WPF; вы создаете классы, задаете свойства, вызываете методы и обрабатываете события, используя выбранный вами язык программирования .NET Framework, такой как C# или Visual Basic.

Для поддержки некоторых более мощных возможностей WPF и для упрощения программирования WPF включает дополнительные программные конструкции, которые улучшают свойства зависимостей и перенаправленные события. Дополнительные сведения о свойствах зависимостей см. в разделе Общие сведения о свойствах зависимости. Дополнительные сведения о перенаправленных событиях см. в разделе Общие сведения о перенаправленных событиях.

Разметка и код программной части

WPF предлагает дополнительные программные усовершенствования для разработки клиентских приложений Windows. Одним очевидным усовершенствованием является возможность разрабатывать приложения с помощью разметки и кода программной части, с которыми разработчики ASP.NET должны быть уже знакомы. Разметка Язык XAML (Extensible Application Markup Language) обычно используется для реализации внешнего вида приложения при реализации его поведения с помощью управляемых языков программирования (кода программной части). Это разделение внешнего вида и поведения имеет следующие преимущества:

  • Затраты на разработку и обслуживание снижаются, так как разметка определенного внешнего вида тесно не связана с кодом определенного поведения.

  • Разработка более эффективна, так как разработчики, реализующие внешний вид приложения, могут это делать одновременно с разработчиками, реализующими поведение приложения.

  • Множество средств проектирования можно использовать для реализации и совместного использования разметки XAML, чтобы удовлетворить требованиям участников разработки приложения; Microsoft Expression Blend предназначен для конструкторов, в то время как Visual Studio 2005 ориентирован на разработчиков.

  • Глобализация и локализация для приложений WPF существенно упрощены (см.: Общие сведения о глобализации и локализации WPF).

Ниже приводится краткое описание разметки и кода программной части WPF. Дополнительные сведения об этой модели программирования см. в Общие сведения о XAML и в Выделенный код и XAML.

Разметка

XAML ― это язык разметки, основанный на XML, который используется для декларативной реализации внешнего вида приложения. Обычно он используется для создания окон, диалоговых окон, страниц и пользовательских элементов управления, а также для их заполнения элементами управления, фигурами и графикой.

В следующем примере с помощью XAML реализуется внешний вид окна, содержащего одну кнопку.

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    Title="Window with Button"
    Width="250" Height="100">

  <!-- Add button to window -->
  <Button Name="button">Click Me!</Button>

</Window>

В частности, этот XAML определяет окно и кнопку с помощью элементов Window и Button соответственно. Каждый элемент настраивается с помощью атрибутов, например с помощью атрибута Title элемента Window задается текст в заголовке окна. Во время выполнения WPF преобразует элементы и атрибуты, заданные в разметке, в экземпляры классов WPF. Например, элемент Window преобразуется в экземпляр класса Window, свойство Title которого является значением атрибута Title.

На следующем рисунке показан пользовательский интерфейс, который задается с помощью XAML в предыдущем примере.

Окно с кнопкой

Дополнительные сведения см. в разделе Общие сведения о XAML.

Поскольку XAML основан на XML, Пользовательский интерфейс, который формируется с его помощью, является встроенным в иерархию вложенных элементов, называемую деревом элементов. Дерево элементов предоставляет логический и интуитивно понятный способ для создания и управления Пользовательские интерфейсы. Дополнительные сведения см. в разделе Деревья в WPF.

Код программной части

Приложение в основном предназначено для реализации функциональных возможностей, которые отвечают на взаимодействия с пользователем, включая обработку событий (например, нажатие меню, панели инструментов или кнопки) и вызов бизнес-логики и логики доступа к данным в ответ на события. В WPF такое поведение обычно реализуется в коде, который связан с разметкой. Этот тип кода называется кодом программной части. В следующем примере показан код программной части и обновленная разметка из предыдущего примера.

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.AWindow"
    Title="Window with Button"
    Width="250" Height="100">

  <!-- Add button to window -->
  <Button Name="button" Click="button_Click">Click Me!</Button>

</Window>
Namespace SDKSample

    Partial Public Class AWindow
        Inherits System.Windows.Window

        Public Sub New()

            ' InitializeComponent call is required to merge the UI
            ' that is defined in markup with this class, including 
            ' setting properties and registering event handlers
            InitializeComponent()

        End Sub

        Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)

            ' Show message box when button is clicked
            MessageBox.Show("Hello, Windows Presentation Foundation!")

        End Sub

    End Class

End Namespace
using System.Windows; // Window, RoutedEventArgs, MessageBox

namespace SDKSample
{
    public partial class AWindow : Window
    {
        public AWindow()
        {
            // InitializeComponent call is required to merge the UI
            // that is defined in markup with this class, including 
            // setting properties and registering event handlers
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            // Show message box when button is clicked
            MessageBox.Show("Hello, Windows Presentation Foundation!");
        }
    }
}

В этом примере код программной части реализует класс, производный от класса Window. Атрибут x:Class используется, чтобы связать разметку с классом с выделенным кодом InitializeComponent вызывается из конструктора класса с выделенным кодом для объединения пользовательского интерфейса, заданного в разметке, с классом с выделенным кодом. (InitializeComponent генерируется при построении приложения, поэтому нет необходимости реализовывать его вручную.) Комбинация x:Class и InitializeComponent позволяет гарантировать правильную инициализацию созданной реализации. Класс кода программной части также реализует обработчик событий для события кнопки Click. При нажатии кнопки обработчик событий показывает окно сообщения с помощью метода MessageBox.Show.

На следующем рисунке показан результат нажатия этой кнопки.

MessageBox

Дополнительные сведения см. в разделе Выделенный код и XAML.

Приложения

.NET Framework, System.Windows, разметка и код программной части составляют основу разработки приложений WPF. Кроме того, WPF имеет исчерпывающие средства для создания взаимодействия с пользователем с расширенным содержимым. Чтобы упаковать это содержимое и доставить его пользователям в качестве «приложений», WPF предоставляет типы и службы, вместе называемые моделью приложения. Модель приложения поддерживает разработку как автономных, так и размещенных в веб-обозревателе приложений.

Автономные приложения

Для автономных приложений можно создавать доступные из меню и панелей инструментов окна и диалоговые окна с помощью класса Window. На следующем рисунке показано автономное приложение с главным и диалоговым окном.

Главное окно и диалоговое окно

Кроме того, можно использовать следующие диалоговые окна WPF: MessageBox, OpenFileDialog, SaveFileDialog и PrintDialog.

Дополнительные сведения см. в разделе Общие сведения об окнах WPF.

Приложения, размещенные в веб-обозревателе

Для приложений, размещенных в веб-обозревателе, также называемых XBAP (XAML browser applications — приложения обозревателя XAML), можно создавать страницы (Page) и функции страниц (PageFunction<T>); переходить между этими страницами можно с помощью гиперссылок (классы Hyperlink). На следующем рисунке показана страница в XBAP, размещенная в Internet Explorer 7.

Две страницы ведущего приложения

Приложения WPF могут размещаться как в Microsoft Internet Explorer 6, так и в Internet Explorer 7. WPF предлагает два следующих параметра для альтернативных узлов переходов:

  • Frame, чтобы размещать блоки содержимого для навигации в окнах или на страницах.

  • NavigationWindow, чтобы размещать содержимое для навигации во всем окне.

Дополнительные сведения см. в разделе Общие сведения о переходах.

Класс приложения

Как XBAP, так и автономные приложения часто являются достаточно сложными, чтобы требовать дополнительные службы в области определения приложения, включая управление запуском и временем существования, а также совместно используемые свойства и ресурсы. Класс Application инкапсулирует эти службы и многое другое, и он может быть реализован только с помощью XAML, как показано в следующем примере.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    StartupUri="MainWindow.xaml" />

Эта разметка является определением приложения для автономного приложения и дает команду WPF создать объект Application, который автоматически открывает MainWindow при запуске приложения.

Ключевым принципом для понимания Application является то, что он предоставляет общую платформу поддержки для автономных приложений и приложений, размещенных в веб-обозревателе. Например, приведенный выше XAML может использоваться размещенным в веб-обозревателе приложением для автоматического перехода на страницу при запуске XBAP, как показано в следующем примере.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    StartupUri="HomePage.xaml" />

Дополнительные сведения см. в разделе Общие сведения об управлении приложением.

Безопасность

Безопасность важна, поскольку XBAP размещается в веб-обозревателе. В частности, изолированная зона безопасности частичного доверия используется XBAP для наложения ограничений, которые меньше или равны ограничениям, накладываемым на приложения, основанные на HTML. Кроме того, каждая функциональная возможность HTML, которая является безопасной для запуска из XBAP в режиме частичного доверия, проверяется с помощью механизма безопасности, рассматриваемого в Стратегия безопасности Windows Presentation Foundation — проектирование безопасности.

По-прежнему большинство возможностей WPF могут безопасно запускаться из XBAP, как описано в Безопасность частичного доверия Windows Presentation Foundation.

Элементы управления

Взаимодействия с пользователем, предоставляемые моделью приложения, являются сконструированными элементами управления. В WPF «элемент управления» ― это основное понятие, относящееся к категории классов WPF, которые расположены в окне или на странице, имеют пользовательский интерфейс и реализовывают некоторое поведение.

Дополнительные сведения см. в разделе Общие сведения об элементах управления. Вводные примеры см. в разделе Примеры библиотеки элементов управления

Список элементов управления WPF

Здесь перечислены встроенные элементы управления WPF.

Ввод и команды

Элементы управления наиболее часто обнаруживают входные данные пользователя и отвечают на них. Система ввода WPF использует как прямые, так и перенаправленные события для поддержки ввода текста, управления фокусом и позиционирования мыши. Дополнительные сведения см. в разделе Общие сведения о входных данных.

Приложения часто предъявляют сложные требования для ввода данных. WPF предоставляет систему команд, которая разделяет ввод пользователя и код, который отвечает на эти действия пользователя. Дополнительные сведения см. в разделе Общие сведения о системе команд.

Структура

При создании Пользовательский интерфейс происходит упорядочивание элементов управления по расположению и размеру для формирования структуры. Основным требованием любой структуры является адаптируемость к изменениям размера окна и параметрам отображения. Чтобы не пришлось создавать код для адаптации структуры в таких обстоятельствах, WPF предоставляет первоклассную расширяемую систему структуры.

Основой системы структуры является относительное позиционирование, что увеличивает способность адаптации к изменяемому окну и условиям отображения. Кроме того, система структуры управляет согласованием между элементами управления для определения структуры. Такое согласование состоит из двух этапов: сначала элемент управления сообщает родительскому элементу, какое расположение и размер требуется; затем родительский элемент сообщает элементу управления, какое пространство он может занять.

Система структуры предоставляется дочерним элементам управления через базовые классы WPF. Для общих структур, таких как сетки, вложение и закрепление, WPF включает различные элементы управления структурой:

  • Canvas: дочерние элементы управления предоставляют свои собственные макеты.

  • DockPanel: дочерние элементы управления выравниваются по краям панели.

  • Grid: дочерние элементы управления располагаются по строкам и столбцам.

  • StackPanel: дочерние элементы управления располагаются либо горизонтально, либо вертикально.

  • VirtualizingStackPanel: дочерние элементы управления являются виртуальными и располагаются в одной горизонтальной или вертикальной строке.

  • WrapPanel: дочерние элементы управления располагаются в порядке слева-направо и переносятся на следующую строку, когда в текущей строке не хватает места.

В следующем примере с помощью DockPanel размещаются различные элементы управления TextBox.

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.LayoutWindow"
    Title="Layout with the DockPanel" Height="143" Width="319">

  <!--DockPanel to layout four text boxes--> 
  <DockPanel>
    <TextBox DockPanel.Dock="Top">Dock = "Top"</TextBox>
    <TextBox DockPanel.Dock="Bottom">Dock = "Bottom"</TextBox>
    <TextBox DockPanel.Dock="Left">Dock = "Left"</TextBox>
    <TextBox Background="White">This TextBox "fills" the remaining space.</TextBox>
  </DockPanel>

</Window>

DockPanel позволяет дочерним элементам управления TextBox сообщать о способе их упорядочивания. Для этого DockPanel реализовывает свойство Dock, которое предоставляется дочерним элементам управления, чтобы позволить каждому из них указать стиль закрепления.

Aa970268.alert_note(ru-ru,VS.90).gifПримечание.

Свойство, которое реализовано родительским элементом управления для использования дочерними элементами управления, является конструкцией WPF, называемой вложенным свойством зависимостей (см. Общие сведения о вложенных свойствах зависимостей).

На следующем рисунке показан результат разметки XAML из предыдущего примера.

Страница DockPanel

Дополнительные сведения см. в разделе Система макета. Вводный пример см. в разделе Пример отображения галереи макетов WPF.

Привязка данных

Большинство приложений создаются для предоставления пользователям средств просмотра и редактирования данных. В приложениях WPF работа по хранению и доступу к данным уже обеспечена такими технологиями, как Microsoft SQL Server и ADO.NET. После того как доступ к данным получен, и данные загружены в управляемые объекты приложения, начинается тяжелая работа для приложений WPF. По существу, она включает в себя две вещи:

  1. копирование данных из управляемых объектов в элементы управления, где данные могут отображаться и редактироваться;

  2. проверка того, что изменения, внесенные в данные с помощью элементов управления, скопированы обратно в управляемые объекты.

Чтобы упростить разработку приложений, WPF предоставляет механизм привязки данных для автоматического выполнения этих этапов. Основной единицей механизма привязки данных является класс Binding, назначение которого привязать элемент управления (цель привязки) к объекту данных (источник привязки). Это отношение показано на следующем рисунке.

Основная схема привязки данных

В следующем примере показано, как осуществить привязку TextBox к экземпляру настраиваемого объекта Person. Реализация Person показана в следующем коде.

Namespace SDKSample

    Class Person

        Private _name As String = "No Name"

        Public Property Name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = value
            End Set
        End Property

    End Class

End Namespace
namespace SDKSample
{
    class Person
    {
        string name = "No Name";

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
}

Следующая разметка привязывает TextBox к экземпляру настраиваемого объекта Person.

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.DataBindingWindow">


...


<!-- Bind the TextBox to the data source (TextBox.Text to Person.Name) -->
<TextBox Name="personNameTextBox" Text="{Binding Path=Name}" />


...


</Window>
Imports System.Windows ' Window

Namespace SDKSample

    Partial Public Class DataBindingWindow
        Inherits Window

        Public Sub New()
            InitializeComponent()

            ' Create Person data source
            Dim person As Person = New Person()

            ' Make data source available for binding
            Me.DataContext = person

        End Sub

    End Class

End Namespace
using System.Windows; // Window

namespace SDKSample
{
    public partial class DataBindingWindow : Window
    {
        public DataBindingWindow()
        {
            InitializeComponent();

            // Create Person data source
            Person person = new Person();

            // Make data source available for binding
            this.DataContext = person;
        }
    }
}

В этом примере класс Person создается в коде программной части и задается в качестве контекста данных для DataBindingWindow. В разметке свойство Text элемента TextBox привязано к свойству Person.Name (с помощью синтаксиса XAML «{Binding ... }»). XAML указывает WPF привязать элемент управления TextBox к объекту Person, который хранится в свойстве DataContext окна.

Механизм привязки данных WPF предоставляет дополнительную поддержку, включающую проверку, сортировку, фильтрацию и группировку. Кроме того, привязка данных поддерживает использование шаблонов данных для создания настраиваемого Пользовательский интерфейс, чтобы связывать данные, когда Пользовательский интерфейс отображается несоответствующими стандартными элементами управления WPF.

Дополнительные сведения см. в разделе Общие сведения о связывании данных. Вводный пример см. в разделе Пример привязки данных.

Графика

WPF представляет обширный, масштабируемый и гибкий набор графических возможностей, которые имеют следующие преимущества:

  • Графика, не зависящая от разрешения и устройства. Основной единицей измерения в графической системе WPF является аппаратно-независимая точка, которая составляет 1/96 часть дюйма независимо от фактического разрешения экрана и предоставляет основу для создания изображения, независимого от разрешения и устройства. Каждая аппаратно независимая точка автоматически масштабируется для соответствия параметру «точек на дюйм» (dpi) системы, в которой он отображается.

  • Повышенная точность. В системе координат WPF используются числа с плавающей запятой двойной точности, вместо одиночной точности. Значения преобразований и непрозрачности также выражаются числами двойной точности. Кроме того, WPF поддерживает широкую цветовую гамму (scRGB) и предоставляет встроенную поддержку для управления входными данными из различных цветовых пространств.

  • Дополнительная поддержка графики и анимации. WPF упрощает программирование графики с помощью управляемых анимированных изображений; нет необходимости беспокоиться об обработке таких изображений, циклах отрисовки и билинейной интерполяции. Кроме того, WPF предоставляет поддержку проверки нажатия и полную поддержку альфа-компоновки.

  • Аппаратное ускорение. Графическая система WPF использует преимущества графического оборудования, чтобы уменьшить использование ЦП.

Двухмерные формы

WPF предоставляет библиотеку общих двухмерный фигур, нарисованных с помощью векторов, таких, как прямоугольники и эллипсы, показанные на следующем рисунке.

Эллипсы и прямоугольники

Интересная особенность фигур в том, что они могут не только отображаться; фигуры реализовывают многие возможности, ожидаемые от элементов управления, включая ввод с клавиатуры и ввод с помощью мыши. В следующем примере показано событие MouseUp обрабатываемого Ellipse.

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.EllipseEventHandlingWindow"
    Title="Click the Ellipse">
    <Ellipse Name="clickableEllipse" Fill="Blue" MouseUp="clickableEllipse_MouseUp" />
</Window>
Imports System.Windows ' Window, MessageBox
Imports System.Windows.Input ' MouseButtonEventArgs

Namespace SDKSample

    Public Class EllipseEventHandlingWindow
        Inherits Window

        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub clickableEllipse_MouseUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
            MessageBox.Show("You clicked the ellipse!")
        End Sub

    End Class

End Namespace
using System.Windows; // Window, MessageBox
using System.Windows.Input; // MouseButtonEventHandler

namespace SDKSample
{
    public partial class EllipseEventHandlingWindow : Window
    {
        public EllipseEventHandlingWindow()
        {
            InitializeComponent();
        }

        void clickableEllipse_MouseUp(object sender, MouseButtonEventArgs e)
        {
            // Display a message
            MessageBox.Show("You clicked the ellipse!");
        }
    }
}

На следующем рисунке показано, что именно создается с помощью приведенного выше кода.

Окно с текстом “you clicked the ellipse!”

Дополнительные сведения см. в разделе Обзор фигур и базовых средств рисования в приложении WPF. Вводный пример см. в разделе Пример элементов геометрических фигур.

Двухмерная геометрия

Фигуры двухмерный, предоставляемые WPF, представляют собой стандартный набор базовых фигур. Однако, возможно, потребуется создать пользовательские фигуры для облегчения разработки настраиваемого Пользовательский интерфейс. В этих целях WPF предоставляет геометрические объекты. На следующем рисунке показано использование геометрий для создания пользовательской фигуры, которая может быть нарисована непосредственно, использоваться в качестве кисти, или использоваться для отсечения других фигур и элементов управления.

Объекты Path могут быть использованы для рисования замкнутых, открытых, составных фигур и даже кривых поверхностей.

Объекты Geometry могут использоваться для отсечения, проверки нажатия и отрисовки данных двухмерной графики.

Различные способы использования Path

Дополнительные сведения см. в разделе Общие сведения о классе Geometry. Вводный пример см. в разделе Примеры работы с геометрическими объектами.

Двухмерные эффекты

Подмножество средств двухмерныйWPF включает визуальные эффекты, такие как градиенты, точечные рисунки, чертежи, рисунки с видео, поворот, масштабирование и наклон. Все это достигается с помощью кистей; на следующем рисунке показано несколько примеров.

Иллюстрация различных кистей

Дополнительные сведения см. в разделе Общие сведения о кистях WPF. Вводный пример см. в разделе Пример использования кистей.

Трехмерная визуализация

WPF также включает возможности отрисовки трехмерный, интегрированные с двухмерный графикой, чтобы позволить создание более яркого и интересного Пользовательские интерфейсы. Например, следующий рисунок показывает изображения двухмерный, отображаемые в фигурах трехмерный.

Снимок экрана примера Visual3D

Дополнительные сведения см. в разделе Обзор трехмерной графики. Вводный пример см. в разделе Пример трехмерных объектов.

Анимация

Поддержка анимации WPF позволяет осуществлять рост, вибрацию, вращение и исчезновение элементов управления для создания интересных страничных переходов и других эффектов. Можно анимировать большинство классов WPF, даже настраиваемые классы. На следующем рисунке показана простая анимация в действии.

Изображения анимированного куба

Дополнительные сведения см. в разделе Общие сведения об эффектах анимации. Вводный пример см. в разделе Коллекция примеров анимации.

Мультимедиа

Одним из способов передачи богатого содержимого является использование аудиовизуальной среды. WPF предоставляет специальную поддержку для изображений, видео и аудио.

Изображения

Изображения присутствуют в большинстве приложений, и WPF предоставляет несколько способов их использования. На следующем рисунке показан Пользовательский интерфейс со списком, в котором содержатся эскизные изображения. При выделении эскиза изображение показывается в полном размере.

Эскизы и полноразмерное изображение

Дополнительные сведения см. в разделе Общие сведения об обработке изображений. Вводный пример см. в разделе Пример средства просмотра фотографий на базе WPF.

Видео и аудио

Элемент управления MediaElement способен воспроизводить видео и аудио, и является достаточно гибким, чтобы служить основой для пользовательского проигрывателя. Следующая разметка XAML реализовывает проигрыватель.

<MediaElement 
  Name="myMediaElement" 
  Source="media/wpf.wmv" 
  LoadedBehavior="Manual" 
  Width="350" Height="250" />

Окно на следующем рисунке показывает элемент управления MediaElement в действии.

Элемент управления MediaElement с аудио и видео

Дополнительные сведения см. в разделе Общие сведения о графике, анимации и мультимедиа WPF. Вводный пример см. в разделе Коллекция мультимедийных приложений.

Текст и типография

Для облегчения отрисовки текста высокого качества WPF предоставляет следующие возможности:

  • Поддержка шрифта OpenType.

  • Улучшения ClearType.

  • Высокая производительность, которая использует преимущества аппаратного ускорения.

  • Интеграция текста с мультимедиа, графикой и анимацией.

  • Механизмы резервирования и поддержки международного шрифта.

Для демонстрации интеграции текста с графикой на следующем рисунке показано применение художественного оформления текста.

Текст с различными украшениями

Дополнительные сведения см. в разделе Типография в Windows Presentation Foundation. Вводные примеры см. в разделе Примеры типографского оформления

Документы

WPF имеет встроенную поддержку для работы с тремя типами документов: фиксированного формата, нефиксированного формата и Формат XPS (XML Paper Specification). WPF также предоставляет службы для создания, просмотра, управления, комментирования, пакетирования и печати документов.

Документы нефиксированного формата

Документы нефиксированного формата разработаны для оптимизации просмотра и читаемости посредством динамической настройки и обновления содержимого при изменении размера окна и параметров дисплея. Следующая разметка XAML показывает определение FlowDocument.

<FlowDocument xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation">

  <Paragraph FontSize="18" FontWeight="Bold">Flow Document</Paragraph>

  <Paragraph>
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
    nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi
    enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis
    nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure.
  </Paragraph>


...


</FlowDocument>

В следующем примере демонстрируется загрузка документа нефиксированного формата в FlowDocumentReader для просмотра, поиска и печати.

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.FlowDocumentReaderWindow"
    Title="Flow Document Reader">
  <FlowDocumentReader Name="flowDocumentReader" />
</Window>
Imports System.Windows 'Window
Imports System.Windows.Documents 'FlowDocument
Imports System.IO 'FileStream, FileMode
Imports System.Windows.Markup 'XamlReader

Namespace SDKSample

    Public Class FlowDocumentReaderWindow
        Inherits Window

        Public Sub New()
            Me.InitializeComponent()
            Using stream1 As FileStream = New FileStream("AFlowDocument.xaml", _
                FileMode.Open, FileAccess.Read)
                Dim document1 As FlowDocument = _
                    TryCast(XamlReader.Load(stream1), FlowDocument)
                Me.flowDocumentReader.Document = document1
            End Using
        End Sub

    End Class

End Namespace
using System.Windows; // Window
using System.Windows.Documents; // FlowDocument
using System.IO; // FileStream, FileMode
using System.Windows.Markup; // XamlReader

namespace SDKSample
{
    public partial class FlowDocumentReaderWindow : System.Windows.Window
    {
        public FlowDocumentReaderWindow()
        {
            InitializeComponent();

            // Open the file that contains the FlowDocument
            using (FileStream xamlFile = new FileStream("AFlowDocument.xaml", 
                FileMode.Open, FileAccess.Read))
            {
                // Parse the file with the XamlReader.Load method
                FlowDocument content = XamlReader.Load(xamlFile) as FlowDocument;

                // Set the Document property to the parsed FlowDocument object
                this.flowDocumentReader.Document = content;
            }
        }
    }
}

В следующем примере показан результат.

Документ нефиксированного формата в элементе управления FlowDocumentReader

Дополнительные сведения см. в разделе Общие сведения о документе нефиксированного формата. Вводный пример см. в разделе Пример использования свойств класса FlowDocument.

Документы фиксированного формата

Документы фиксированного формата предназначены для приложений, в которых требуется точное представление вида «что видишь, то и получишь» (режим полного соответствия изображения на экране и распечатки WYSIWYG), особенно по отношению к печати. Документы фиксированного формата обычно используются при подготовке публикаций с помощью настольных издательских средств, обработке текста и разметке формы, где строгое соблюдение исходного дизайна страницы является обязательным.

В документах фиксированного формата поддерживается точное размещение содержимого независимо от устройства. Например, документ фиксированного формата отображается на мониторе с разрешением 96 точек на дюйм точно так же, как при печати на лазерном принтере с разрешением 600 точек на дюйм или на фотонаборной машине с разрешением 4800 точек на дюйм. Макет документа остается одинаковым во всех случаях, хотя качество документа варьируется в зависимости от возможностей каждого устройства.

Дополнительные сведения см. в разделе Документы в Windows Presentation Foundation.

Документы XPS

Документы Формат XPS (XML Paper Specification) построены на документах фиксированного формата WPF. Документы XPS описываются схемой, основанной на XML, которая по существу является страничным представлением электронного документа. XPS представляет собой открытый, межплатформенный формат документа, который предназначен для упрощения создания, совместного использования, печати и хранения страничных документов. Технология XPS включает следующие важные возможности:

  • Упаковка документов XPS в виде файлов ZipPackage, которые соответствуют Open Packaging Conventions (OPC).

  • Размещение в автономных и в размещенных в веб-обозревателе приложениях.

  • Создание документов XPS и управление ими из приложений WPF вручную.

  • Высокоточная отрисовка путем выбора устройства вывода максимального качества.

  • Очередь печати принтера Windows Vista.

  • Прямая отправка документов на XPS-совместимые принтеры.

  • Интеграция Пользовательский интерфейс с DocumentViewer.

На следующем рисунке показан документ XPS, который отображается с помощью DocumentViewer.

Документ XPS с элементом управления DocumentViewer

DocumentViewer также дает возможность пользователям изменять просмотр, поиск и печать документов XPS.

Дополнительные сведения см. в разделе Документы в Windows Presentation Foundation. Вводный пример см. в разделе Пример создания документа XPS.

Заметки

Заметки ― это примечания или комментарии, которые добавляются к документу, чтобы отметить информацию или выделить интересующие элементы для дальнейшего использования. В напечатанных документах делать заметки просто, но в электронных документах возможность создания заметок часто ограничена или отсутствует. Однако в WPF для поддержки возможности создания комментариев-наклеек и выделений предоставляется система заметок. Кроме того, эти заметки можно применять к документам, размещенным в элементе управления DocumentViewer, как показано на следующем рисунке.

Стиль заметок

Дополнительные сведения см. в разделе Общие сведения о заметках. Вводный пример см. в разделе Пример сериализации документа.

Упаковка

WPF System.IO.Packaging API-интерфейсы позволяет приложениям организовывать данные, содержимое и ресурсы в единые, переносимые, удобные для распространения и для доступа упакованные документы. Для проверки подлинности элементов, включенных в пакет, можно включать цифровые подписи, с помощью которых можно также удостовериться, что подписанный элемент не был подделан или изменен. Кроме того, можно ограничить доступ к защищенной информации, зашифровав пакеты с помощью системы управления правами.

Дополнительные сведения см. в разделе Документы в Windows Presentation Foundation. Примеры содержатся в разделе Примеры упаковки.

Печать

.NET Framework включает подсистему печати, которую WPF дополняет поддержкой для расширенного управления системой печати. Улучшения печати включают следующее:

  • Установка удаленных серверов и очередей печати в режиме реального времени.

  • Динамическое обнаружение возможностей принтера.

  • Динамическая установка параметров принтера.

  • Перенаправление и изменение приоритета заданий на печать.

В документах XPS также имеется ключевое улучшение производительности. Существующий путь для печати Интерфейс графических устройств (GDI) Microsoft Windows обычно требует два преобразования:

  • первое ― преобразование документа в формат процессора печати, например в EMF (Enhanced Metafile —расширенный метафайл);

  • второе ― преобразование в язык описания страниц принтера, например в Printer Control Language (PCL) или PostScript.

Однако документы XPS обходятся без этих преобразований, поскольку один компонент формата файла XPS является языком процессора печати и языком описания страницы. Эта поддержка позволяет уменьшить как размер файла очереди, так и загрузки сетевых принтеров.

Дополнительные сведения см. в разделе Общие сведения о печати. Вводный пример см. в разделе Печать документа XPS.

Настройка приложений WPF

К данному этапу уже произошло знакомство с основными строительными блоками WPF для разработки приложений. Было изучено использование модели приложения для размещения и предоставления содержимого приложения, которое в основном состоит из элементов управления. Показано использование системы макета WPF, чтобы упростить процесс расположения элементов управления в Пользовательский интерфейс и чтобы убедиться, что расположение сохраняется при изменениях размеров окна и параметров дисплея. Поскольку большинство приложений предоставляют пользователям возможность взаимодействия с данными, было изучено использование привязки данных для уменьшения работы по интеграции Пользовательский интерфейс с данными. Для улучшения внешнего вида приложения освоен широкий спектр графических изображений, анимации и мультимедиа, предоставляемый WPF. Наконец, если приложение работает с текстом и документами, было изучено использование текста, типографии, документов, заметок, упаковок и возможностей печати WPF.

Однако зачастую основных возможностей недостаточно для создания особых и визуально впечатляющих возможностей для пользователя и для управления ими. Стандартные элементы управления WPF могут не подходить для создания требуемого внешнего вида приложения. Данные могут отображаться не самым лучшим образом. Общее взаимодействие с пользователем приложения может не подходить к используемому по умолчанию внешнему виду и темам Windows. Во многих случаях технологии презентации требуется визуальное расширение, как и любой другой тип расширения.

По этой причине WPF предоставляет разнообразные механизмы для создания уникальных взаимодействий с пользователем, включая расширенную модель содержимого для элементов управления, триггеров, а также шаблонов, стилей, ресурсов Пользовательский интерфейс, тем и обложек элементов управления и данных.

Модель содержимого

Главной задачей большей части элементов управления WPF является отображение содержимого. В WPF тип и количество элементов, которые могут составлять содержимое элемента управления, называется моделью содержимого элемента управления. Некоторые элементы управления могут содержать один элемент и один тип содержимого; например, содержимое TextBox ― строковое значение, которое назначается свойству Text. В следующем примере задается содержимое элемента управления TextBox.

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.TextBoxContentWindow"
    Title="TextBox Content">


...


<TextBox Text="This is the content of a TextBox." />


...


</Window>

На следующем рисунке показан результат.

Элемент управления TextBox с текстом

Однако другие элементы управления, могут содержать несколько элементов с разными типами содержимого; например содержимое элемента управления Button, заданное в свойстве Content, может содержать разнообразные элементы, включая элементы управления макета, текст, изображения и фигуры. В следующем примере показан элемент управления Button с содержимым, которое включает элементы DockPanel, Label, Border и MediaElement.

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.ButtonContentWindow"
    Title="Button Content">


...


<Button Margin="20">
  <!-- Button Content -->
  <DockPanel Width="200" Height="180">
    <Label DockPanel.Dock="Top" HorizontalAlignment="Center">Click Me!</Label>
    <Border Background="Black" BorderBrush="Yellow" BorderThickness="2" 
      CornerRadius="2" Margin="5">
      <MediaElement Source="media/wpf.wmv" Stretch="Fill" />
    </Border>
  </DockPanel>
</Button>


...


</Window>

На следующем рисунке показано содержимое этой кнопки.

Кнопка с множественными типами содержания

Дополнительные сведения о видах содержимого, которое поддерживается различными элементами управления, см. в разделе Модель содержимого WPF.

Триггеры

Главной задачей разметки XAML является реализация внешнего вида приложения, однако XAML можно также использовать для реализации некоторых аспектов поведения приложения. Например, с помощью триггеров изменять внешний вид приложения в зависимости от действий пользователя. Дополнительные сведения см. раздел «Триггеры» в Стилизация и использование шаблонов.

Шаблоны элементов управления

Пользовательские интерфейсы по умолчанию для элементов управления WPF обычно создается из других элементов управления и фигур. Например, Button состоит из элементов управления ButtonChrome и ContentPresenter. ButtonChrome обеспечивает стандартный внешний вид кнопки, в то время как ContentPresenter отображает содержимое кнопки, заданное свойством Content.

Иногда внешний вид элемента управления по умолчанию может не сочетаться с общим внешним видом приложения. В этом случае можно с помощью ControlTemplate изменить внешний вид Пользовательский интерфейс элемента управления без изменения его содержимого и поведения.

В следующем примере показано изменение внешнего вида Button с помощью ControlTemplate.

<Window 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.ControlTemplateButtonWindow"
  Title="Button with Control Template" Height="158" Width="290">

  <!-- Button using an ellipse -->
  <Button Content="Click Me!" Click="button_Click">
    <Button.Template>
      <ControlTemplate TargetType="{x:Type Button}">
        <Grid Margin="5">
          <Ellipse Stroke="DarkBlue" StrokeThickness="2">
            <Ellipse.Fill>
              <RadialGradientBrush Center="0.3,0.2" RadiusX="0.5" RadiusY="0.5">
                <GradientStop Color="Azure" Offset="0.1" />
                <GradientStop Color="CornflowerBlue" Offset="1.1" />
              </RadialGradientBrush>
            </Ellipse.Fill>
          </Ellipse>
          <ContentPresenter Name="content" HorizontalAlignment="Center" 
            VerticalAlignment="Center"/>
        </Grid>
      </ControlTemplate>
    </Button.Template>

  </Button>

</Window>
Imports System.Windows ' Window, RoutedEventArgs, MessageBox

Namespace SDKSample

    Public Class ControlTemplateButtonWindow
        Inherits Window

        Public Sub New()

            InitializeComponent()

        End Sub

        Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            MessageBox.Show("Hello, Windows Presentation Foundation!")
        End Sub

    End Class

End Namespace
using System.Windows; // Window, RoutedEventArgs, MessageBox

namespace SDKSample
{
    public partial class ControlTemplateButtonWindow : Window
    {
        public ControlTemplateButtonWindow()
        {
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            // Show message box when button is clicked
            MessageBox.Show("Hello, Windows Presentation Foundation!");
        }
    }
}

В этом примере кнопка Пользовательский интерфейс, созданная по умолчанию, была заменена кнопкой Ellipse, которая имеет темно-синюю границу и закрашена с помощью RadialGradientBrush. Элемент управления ContentPresenter показывает содержимое «Click Me!» кнопки Button. При нажатии на кнопку Button событие Click по-прежнему вызывается как часть поведения по умолчанию элемента управления Button. Результат показан на следующем рисунке.

Кнопка в виде эллипса и второе окно

Дополнительные сведения см. в разделе ControlTemplate. Вводный пример см. в разделе Пример стилизации с использованием ControlTemplates.

Шаблоны данных

В то время как шаблон элемента управления позволяет задавать внешний вид элемента управления, шаблон данных позволяет задавать внешний вид содержимого элемента управления. Шаблоны данных часто используются для улучшения способа отображения данных, связанных с элементом управления. На следующем рисунке показан внешний вид по умолчанию элемента управления ListBox, который связан с коллекцией объектов Task, где каждый объект имеет имя, описание и приоритет.

Список с видом по умолчанию

Внешний вид по умолчанию ― это вид, который ожидается от ListBox. Однако внешний вид по умолчанию каждого объекта коллекции содержит только имя. Чтобы отобразить имя, описание и приоритет объекта коллекции, внешний вид по умолчанию элементов связанного списка элемента управления ListBoxдолжен быть изменен с помощью DataTemplate. Следующий XAML задает такой шаблон DataTemplate, который применяется к каждому объекту коллекции с помощью атрибута ItemTemplate.

<Window
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.DataTemplateWindow"
  Title="With a Data Template">


...


<!-- Data Template (applied to each bound task item in the task collection) -->
<DataTemplate x:Key="myTaskTemplate">
  <Border Name="border" BorderBrush="DarkSlateBlue" BorderThickness="2" 
    CornerRadius="2" Padding="5" Margin="5">
    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
      </Grid.ColumnDefinitions>
      <TextBlock Grid.Row="0" Grid.Column="0" Padding="0,0,5,0" Text="Task Name:"/>
      <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=TaskName}"/>
      <TextBlock Grid.Row="1" Grid.Column="0" Padding="0,0,5,0" Text="Description:"/>
      <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Description}"/>
      <TextBlock Grid.Row="2" Grid.Column="0" Padding="0,0,5,0" Text="Priority:"/>
      <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=Priority}"/>
    </Grid>
  </Border>  
</DataTemplate>


...


<!-- Data template is specified by the ItemTemplate attribute -->
<ListBox 
  ItemsSource="{Binding}" 
  ItemTemplate="{StaticResource myTaskTemplate}" 
  HorizontalContentAlignment="Stretch" 
  IsSynchronizedWithCurrentItem="True" 
  Margin="5,0,5,5" />


...


</Window>

На следующем рисунке показан результат этого кода.

Список, использующий шаблона данных

Обратите внимание, что элемент управления ListBox сохраняет свое поведение и общий внешний вид; был изменен только внешний вид содержимого, отображаемого в списке.

Дополнительные сведения см. в разделе Общие сведения о шаблонах данных. Вводный пример см. в разделе Введение в шаблоны данных.

Стили

Стили позволяют разработчикам и конструкторам стандартизировать определенный внешний вид для своих продуктов. WPF предоставляет строгую модель стиля, основой которой является элемент Style. В следующем примере создается стиль, который устанавливает цвет фона Orange для каждой кнопки Button в окне.

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.StyleWindow"
    Title="Styles">


...


<!-- Style that will be applied to all buttons -->
<Style TargetType="{x:Type Button}">
  <Setter Property="Background" Value="Orange" />
  <Setter Property="BorderBrush" Value="Crimson" />
  <Setter Property="FontSize" Value="20" />
  <Setter Property="FontWeight" Value="Bold" />
  <Setter Property="Margin" Value="5" />
</Style>


...


<!-- This button will have the style applied to it -->
<Button>Click Me!</Button>

<!-- This labe will not have the style applied to it -->
<Label>Don't Click Me!</Label>

<!-- This button will have the style applied to it -->
<Button>Click Me!</Button>


...


</Window>

Поскольку этот стиль задается для всех элементов управления Button, он будет автоматически применен ко всем кнопкам в окне, как показано на следующем рисунке.

Две оранжевые кнопки

Дополнительные сведения см. в разделе Стилизация и использование шаблонов. Вводный пример см. в разделе Пример знакомства со стилизацией и использованием шаблонов.

Ресурсы

Элементы управления в приложении должны использовать один и тот же внешний вид, который может включать любые шрифты и цвета фона для шаблонов элементов управления, шаблонов данных и стилей. С помощью поддержки WPF для ресурсов пользовательский интерфейс можно инкапсулировать эти ресурсы в одном расположении для повторного использования.

В следующем примере определяется общий цвет фона, который будет совместно использоваться элементами управления Button и Label.

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.ResourcesWindow"
    Title="Resources Window">

  <!-- Define window-scoped background color resource -->
  <Window.Resources>
    <SolidColorBrush x:Key="defaultBackground" Color="Red" />
  </Window.Resources>


...


<!-- Button background is defined by window-scoped resource -->
<Button Background="{StaticResource defaultBackground}">One Button</Button>

<!-- Label background is defined by window-scoped resource -->
<Label Background="{StaticResource defaultBackground}">One Label</Label>


...


</Window>

Этот пример реализует ресурс цвета фона с помощью свойства Window.Resources. Этот ресурс доступен всем дочерним элементам Window. Существует множество областей действия ресурсов, включая следующие, перечисленные в порядке, в котором они применяются:

  1. Отдельные элементы управления (использующие наследуемое свойство FrameworkElement.Resources).

  2. Window или Page (также использующие наследуемое свойство FrameworkElement.Resources).

  3. Application (использующее свойство Application.Resources).

Разнообразие областей действия обеспечивает гибкость по отношению к способу определения и совместного использования ресурсов.

В качестве альтернативы прямому сопоставлению ресурсов с определенной областью действия, можно скомпоновать один или несколько ресурсов с помощью отдельных словарей ресурсов ResourceDictionary, на которые можно ссылаться в других частях приложения. В следующем примере цвет фона по умолчанию задается в словаре ресурсов.

<ResourceDictionary 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">

  <!-- Define background color resource -->
  <SolidColorBrush x:Key="defaultBackground" Color="Red" />

  <!-- Define other resources -->


...


</ResourceDictionary>

В следующем примере показано, как выполнить ссылку на словарь ресурсов, заданный в предыдущем примере, чтобы он совместно использовался во всем приложении.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App">

  <Application.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="BackgroundColorResources.xaml"/>
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </Application.Resources>


...


</Application>

Ресурсы и словари ресурсов являются основой поддержки WPF тем и обложек.

Дополнительные сведения см. в разделе Общие сведения о ресурсах. Вводный пример см. в разделе Пример использования ресурсов приложения.

Темы и обложки

С визуальной точки зрения тема определяет глобальный внешний вид Windows и приложений, которые в ней запускаются. Windows поставляется с несколькими темами. Например, Microsoft Windows XP поставляется с темами Windows XP и Windows Classic, а Windows Vista поставляется с темами Windows Vista и Windows Classic. Внешний вид, определяемый темой, задает внешний вид по умолчанию для приложения WPF. Однако WPF не интегрируется напрямую с темами Windows. Поскольку внешний вид WPF определяется шаблонами, WPF включает один шаблон для каждой известной темы Windows, в том числе Aero (Windows Vista), Classic (Microsoft Windows 2000), Luna (Microsoft Windows XP) и Royale (Microsoft Windows XP Media Center Edition 2005). Эти темы упакованы в словари ресурсов, которые применяются, если ресурсы не найдены в приложении. Внешний вид многих приложений задается с помощью этих тем; сохраняющаяся согласованность с внешним видом Windows помогает пользователям быстрее освоиться с большинством приложений.

С другой стороны, опыт работы пользователя с некоторыми приложениями не обязательно связан с стандартными темами. Например, Проигрыватель Microsoft Windows Media работает с аудио- и видеоданными, и здесь преимущество имеют пользователи с опытом работы в другом стиле. Такие Пользовательские интерфейсы чаще предоставляют настраиваемые, специфичные для приложения темы. Такие темы называются «обложки», и приложения, которые их используют, часто предоставляют средства настройки различных аспектов обложек. Проигрыватель Microsoft Windows Media имеет множество собственных обложек и обложек от сторонних производителей.

Темы и обложки в WPF наиболее просто задаются с помощью словарей ресурсов. В следующем примере показан процесс задания обложки.

<!-- Blue Skin -->
<ResourceDictionary
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SDKSample">
  <Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Blue" />
  </Style>


...


</ResourceDictionary>
<!-- Blue Skin -->
<ResourceDictionary
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SDKSample">
  <Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Blue" />
  </Style>


...


</ResourceDictionary>
<!-- Yellow Skin -->
<ResourceDictionary
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SDKSample">
  <Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Yellow" />
  </Style>


...


</ResourceDictionary>
<!-- Yellow Skin -->
<ResourceDictionary
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SDKSample">
  <Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Yellow" />
  </Style>


...


</ResourceDictionary>

Дополнительные сведения см. в разделе «Совместно используемые ресурсы и темы», в подразделе Стилизация и использование шаблонов. Вводный пример см. в разделе Пример приложения с поддержкой вариантов оформления.

Пользовательские элементы управления

Хотя WPF предоставляет узел поддержки настройки, могут возникнуть ситуации, в которых существующие элементы управления WPF не удовлетворяют требованиям приложения или его пользователей. Это возможно в следующих ситуациях:

  • Нужный Пользовательский интерфейс не может быть создан путем настройки внешнего вида и поведения существующих реализаций WPF.

  • Нужное поведение не поддерживается (или поддерживается частично) существующими реализациями WPF.

Тем не менее, в этом случае можно воспользоваться одной из трех моделей WPF для создания нового элемента управления. Каждая модель предназначена для определенного сценария и требует, чтобы пользовательский элемент управления был производным от конкретного базового класса WPF. Далее приводится описание этих трех моделей.

  • Модель пользовательского элемента управления. Пользовательский элемент управления производится из UserControl и состоит из одного или нескольких других элементов управления.

  • Модель элемента управления. Пользовательский элемент управления производится из Control и используется для построения реализаций, в которых внешний вид и поведение разделены с помощью шаблонов, подобно большей части элементов управления WPF. Получение элемента управления, производного от Control, предоставляет по сравнению с пользовательскими элементами управления большую свободу для создания пользовательского Пользовательский интерфейс, но оно может потребовать дополнительных усилий.

  • Модель элемента .NET Framework. Пользовательский элемент управления производится от FrameworkElement, когда его внешний вид определяется пользовательской логикой визуализации (не шаблонами).

В следующем примере показано создание пользовательского элемента управления «numeric up/down», производного от UserControl.

<UserControl
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.NumericUpDown">

  <Grid>

    <Grid.RowDefinitions>
      <RowDefinition/>
      <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition/>
      <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <!-- Value text box -->
    <Border BorderThickness="1" BorderBrush="Gray" Margin="2" Grid.RowSpan="2" 
      VerticalAlignment="Center" HorizontalAlignment="Stretch">
      <TextBlock Name="valueText" Width="60" TextAlignment="Right" Padding="5"/>
    </Border>

    <!-- Up/Down buttons -->
    <RepeatButton Name="upButton" Click="upButton_Click" Grid.Column="1" 
      Grid.Row="0">Up</RepeatButton>
    <RepeatButton Name="downButton" Click="downButton_Click" Grid.Column="1" 
      Grid.Row="1">Down</RepeatButton>

  </Grid>

</UserControl>
imports System 'EventArgs
imports System.Windows 'DependencyObject, DependencyPropertyChangedEventArgs, 
                       ' FrameworkPropertyMetadata, PropertyChangedCallback, 
                       ' RoutedPropertyChangedEventArgs
imports System.Windows.Controls 'UserControl

Namespace SDKSample

    ' Interaction logic for NumericUpDown.xaml
    Partial Public Class NumericUpDown
        Inherits System.Windows.Controls.UserControl

        'NumericUpDown user control implementation


...



    End Class

End Namespace
using System; // EventArgs
using System.Windows; // DependencyObject, DependencyPropertyChangedEventArgs,
                      // FrameworkPropertyMetadata, PropertyChangedCallback, 
                      // RoutedPropertyChangedEventArgs
using System.Windows.Controls; // UserControl

namespace SDKSample
{
    public partial class NumericUpDown : UserControl
    {
        // NumericUpDown user control implementation


...


    }
}

В следующем примере показан XAML, необходимый для включения пользовательского элемента управления в окно Window.

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.UserControlWindow"
    xmlns:local="clr-namespace:SDKSample" 
    Title="User Control Window">


...


<!-- Numeric Up/Down user control -->
<local:NumericUpDown />


...


</Window>

На следующем рисунке показан элемент управления NumericUpDown, размещенный в окне Window.

Настраиваемый UserControl

Дополнительные сведения о пользовательских элементах управления см. в разделе Общие сведения о разработке управления. Вводные примеры см. в разделе Примеры настройки элементов управления

Советы и рекомендации по WPF

Как любая платформа разработки, WPF может использоваться множеством способов для достижения нужного результата. Для гарантий, что приложения WPF предоставляют требуемое взаимодействие с пользователем и удовлетворяют требованиям аудитории в целом, в данном разделе предлагаются советы и рекомендации по специальным возможностям, глобализации и локализации, а также производительности. Дополнительную информацию см. в следующих разделах:

Сводка

WPF ― это исчерпывающая технология презентации для построения разнообразных, визуально привлекательных клиентских приложений. Это введение предоставляет обзор основных возможностей WPF.

Следующим шагом является построение приложений WPF!

Как только приложения будут построены, можно будет вернуться назад к этому введению, чтобы освежить в памяти основные возможности и найти ссылки на более подробное их рассмотрение.

Рекомендуемые обзоры и примеры

В этом введении упоминаются следующие обзоры и примеры:

Разделы общих сведений

Обзор трехмерной графики

Рекомендации по специальным возможностям

Общие сведения об эффектах анимации

Общие сведения о заметках

Общие сведения об управлении приложением

Общие сведения о системе команд

Общие сведения о разработке управления

Общие сведения об элементах управления

Общие сведения о связывании данных

Общие сведения о шаблонах данных

Общие сведения о свойствах зависимости

Документы в Windows Presentation Foundation

Деревья в WPF

Общие сведения о документе нефиксированного формата

Общие сведения о классе Geometry

Начало работы с рукописными данными

Общие сведения об обработке изображений

Общие сведения о входных данных

Система макета

Общие сведения о переходах

Общие сведения о печати

Общие сведения о ресурсах

Общие сведения о перенаправленных событиях

Обзор фигур и базовых средств рисования в приложении WPF

Типография в Windows Presentation Foundation

Безопасность Windows Presentation Foundation

Общие сведения об окнах WPF

Общие сведения о кистях WPF

Модель содержимого WPF

Общие сведения о глобализации и локализации WPF

Общие сведения о графике, анимации и мультимедиа WPF

Примеры

Пример трехмерных объектов

Примеры реализации специальных возможностей

Коллекция примеров анимации

Пример использования ресурсов приложения

Пример использования кистей

Примеры настройки элементов управления

Примеры библиотеки элементов управления

Пример создания документа XPS

Пример привязки данных

Примеры работы с рукописным вводом в цифровом представлении

Пример сериализации документа

Пример использования свойств класса FlowDocument

Примеры работы с геометрическими объектами

Введение в шаблоны данных

Пример знакомства со стилизацией и использованием шаблонов

Коллекция мультимедийных приложений

Примеры упаковки

Печать документа XPS

Пример элементов геометрических фигур

Обзор фигур и базовых средств рисования в приложении WPF

Пример приложения с поддержкой вариантов оформления

Пример стилизации с использованием ControlTemplates

Примеры типографского оформления

Пример отображения галереи макетов WPF

Пример средства просмотра фотографий на базе WPF

См. также

Основные понятия

Введение в Windows Presentation Foundation

Отзывы и предложения сообщества Windows Presentation Foundation