Введение в WPF

Windows Presentation Foundation (WPF) ― это система следующего поколения для построения клиентских приложений Windows с визуально привлекательными возможностями взаимодействия с пользователем. С помощью WPF можно создавать широкий спектр как автономных, так и размещенных в браузере приложений. На следующем рисунке показан пример одного из таких приложений Contoso Healthcare Sample Application.

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

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

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

Примечание

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

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

  • Программирование с использованием 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 должны быть уже знакомы. Разметка Extensible Application Markup Language (XAML) обычно используется для реализации внешнего вида приложения при реализации его поведения с помощью управляемых языков программирования (кода программной части). Это разделение внешнего вида и поведения имеет следующие преимущества:

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

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

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

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

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

Разметка

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.

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

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

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

Поскольку XAML основан на XML, UI, который формируется с его помощью, организуется в виде иерархии вложенных элементов, называемой деревом элементов. Дерево элементов предоставляет логический и интуитивно понятный способ для создания и управления UIs. Дополнительные сведения см. в разделе Деревья в 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 в WPF.

Приложения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как приложения XBAPs, так и автономные приложения часто являются достаточно сложными, чтобы требовать дополнительные службы в области определения приложения, включая управление запуском и временем существования, а также совместно используемые свойства и ресурсы. Класс 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" />

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

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

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

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

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

Взаимодействия с пользователем, предоставляемые моделью приложения, являются сконструированными элементами управления. В WPF "элемент управления" ― это основное понятие, относящееся к категории классов WPF, которые расположены в окне или на странице, имеют user interface (UI) и реализовывают некоторое поведение.

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

Элементы управления WPF по функциям

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

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

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

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

Макет

При создании UI происходит упорядочивание элементов управления по расположению и размеру для формирования структуры. Основным требованием любой структуры является адаптируемость к изменениям размера окна и параметрам отображения. Чтобы не пришлось создавать код для адаптации структуры в таких обстоятельствах, 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, которое предоставляется дочерним элементам управления, чтобы позволить каждому из них указать стиль закрепления.

Примечание

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

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

Страница DockPanel

Дополнительные сведения см. в разделе Система макета. Ознакомительный пример см. в файле WPF Layout Gallery Sample.

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

Большинство приложений создаются для предоставления пользователям средств просмотра и редактирования данных. В приложениях 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 предоставляет дополнительную поддержку, включающую проверку, сортировку, фильтрацию и группировку. Кроме того, привязка данных поддерживает использование шаблонов данных для создания настраиваемого UI, чтобы связывать данные, когда UI отображается несоответствующими стандартными элементами управления WPF.

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

Графика

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

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

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

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

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

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

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

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

Интересная особенность фигур в том, что они могут не только отображаться; фигуры реализовывают многие возможности, ожидаемые от элементов управления, включая ввод с клавиатуры и ввод с помощью мыши. В следующем примере показано событие 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. Ознакомительный пример см. в файле Shape Elements Sample.

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

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

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

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

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

Дополнительные сведения см. в разделе Общие сведения о классе Geometry. Ознакомительный пример см. в файле Geometries Sample.

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

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

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

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

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

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

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

Дополнительные сведения см. в разделе Обзор трехмерной графики. Ознакомительный пример см. в файле 3-D Solids Sample.

Анимация

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

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

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

Мультимедиа

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

Изображения

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

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

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

Видео и аудио

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Документы

WPF предоставляет встроенную поддержку работы с тремя типами документов: документами нефиксированного формата, документами фиксированного формата и документами XML Paper Specification (XPS). 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

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

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

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

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

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

Документы XPS

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

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

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

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

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

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

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

  • Интеграция UI с DocumentViewer.

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

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

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

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

Заметки

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

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

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

Упаковка

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

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

Печать

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Главной задачей большей части элементов управления 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 также можно использовать для реализации некоторых действий, выполняемых приложением. Например, с помощью триггеров изменять внешний вид приложения в зависимости от действий пользователя. Дополнительные сведения см. раздел "Триггеры" в Стилизация и использование шаблонов.

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

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

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

В следующем примере показано изменение внешнего вида 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!");
        }
    }
}

В этом примере кнопка UI, созданная по умолчанию, была заменена кнопкой Ellipse, которая имеет темно-синюю границу и закрашена с помощью RadialGradientBrush. В элементе управления ContentPresenter выводится содержимое объекта Button ("Click Me!"). Когда пользователь нажимает кнопку Button, событие Click по-прежнему вызывается в рамках стандартной реакции элемента управления Button. Результат показан на следующем рисунке.

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

Дополнительные сведения см. в разделе ControlTemplate. Ознакомительный пример см. в файле Styling with ControlTemplates Sample.

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

В то время как шаблон элемента управления позволяет задавать внешний вид элемента управления, шаблон данных позволяет задавать внешний вид содержимого элемента управления. Шаблоны данных часто используются для улучшения способа отображения данных, связанных с элементом управления. На следующем рисунке показан внешний вид по умолчанию элемента управления 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">


...


<Window.Resources>
  <!-- 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>
</Window.Resources>


...


<!-- UI -->
<DockPanel>
  <!-- Title -->
  <Label DockPanel.Dock="Top" FontSize="18" Margin="5" Content="My Task List:"/>

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

</DockPanel>


...


</Window>

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

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

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

Дополнительные сведения см. в разделе Общие сведения о шаблонах данных. Ознакомительный пример см. в файле Introduction to Data Templating Sample.

стили,

Стили позволяют разработчикам и конструкторам выработать стандарт внешнего вида для продукта. 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 label 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, он будет автоматически применен ко всем кнопкам в окне, как показано на следующем рисунке.

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

Дополнительные сведения см. в разделе Стилизация и использование шаблонов. Ознакомительный пример см. в файле Introduction to Styling and Templating Sample.

Ресурсы

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

В следующем примере определяется общий цвет фона, который будет совместно использоваться элементами управления 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 Player работает с аудио- и видеоданными, и здесь преимущество имеют пользователи с опытом работы в другом стиле. Такие UIs чаще предоставляют настраиваемые, специфичные для приложения темы. Такие темы называются "обложки", и приложения, которые их используют, часто предоставляют средства настройки различных аспектов обложек. Microsoft Windows Media Player имеет множество собственных обложек и обложек от сторонних производителей.

Темы и обложки в 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>
<!-- 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 не удовлетворяют требованиям приложения или его пользователей. Это возможно в следующих ситуациях:

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

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

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

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

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

  • Модель элемента .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!

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

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

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

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

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

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

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

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

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

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

Документы в WPF

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

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

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

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

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

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

Стилизация и использование шаблонов

Оформление в WPF

Безопасность (WPF)

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

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

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

Графика и мультимедиа

Примеры

3-D Solids Sample

Animation Example Gallery

Brushes Sample

Data Binding Demo

Geometries Sample

Introduction to Data Templating Sample

Introduction to Styling and Templating Sample

Shape Elements Sample

Styling with ControlTemplates Sample

WPF Layout Gallery Sample

См. также

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

Пошаговое руководство. Начало работы с WPF

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