Руководство по классическим приложениям (WPF .NET)

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

Важно!

Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.

Существует две реализации WPF:

  1. Версия .NET (это руководство).

    Реализация WPF с открытым кодом, размещенная на GitHub, которая работает в .NET. Для работы конструктора XAML требуется версия Visual Studio 2019 не ниже 16.8. Но в зависимости от версии .NET вам может потребоваться использовать более новую версию Visual Studio.

    Несмотря на то, что .NET является кроссплатформенной технологией, WPF работает только в Windows.

  2. Платформа .NET Framework версии 4.

    Реализация WPF в .NET Framework, поддерживаемая в Visual Studio 2019 и Visual Studio 2017.

    .NET Framework 4 — это версия .NET только для Windows, которая считается компонентом операционной системы Windows. Эта версия WPF распространяется с .NET Framework. Дополнительные сведения о версии WPF для .NET Framework см. в разделе Знакомство с WPF для .NET Framework.

Этот обзор предназначен для новичков: в нем рассматриваются ключевые возможности и понятия WPF. Сведения о создании приложения WPF см. в разделе Учебник: создание нового приложения WPF.

Почему обновление с платформа .NET Framework

При обновлении приложения с платформа .NET Framework до .NET вы сможете воспользоваться следующими преимуществами:

  • Повышенная производительность
  • Новые API .NET
  • Последние улучшения языка
  • Улучшенная доступность и надежность
  • Обновленные инструменты и многое другое

Сведения об обновлении приложения см. в статье "Как обновить классическое приложение WPF до .NET 7".

Программирование с помощью WPF

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

  • Создание экземпляров классов
  • Задание свойств
  • Вызов методов
  • Обработка событий

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

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

WPF позволяет разрабатывать приложения, используя как разметку, так и код программной части, что привычно для разработчиков на ASP.NET. Разметка XAML обычно используется для определения внешнего вида приложения, а управляемые языки программирования (код программной части) — для реализации его поведения. Такое разделение внешнего вида и поведения имеет ряд преимуществ.

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

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

  • Глобализация и локализация приложений WPF упрощена.

Разметка

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

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

<Window
    xmlns="http://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. Каждый элемент настраивается с помощью атрибутов, например атрибута Window элемента Title , определяющего текст заголовка окна. Во время выполнения WPF преобразует элементы и атрибуты, определенные в разметке, в экземпляры классов WPF. Например, элемент Window преобразуется в экземпляр класса Window , свойство Title которого является значением атрибута Title .

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

A window that contains a button

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

Поддерживающий код

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

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://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>

Обновленная разметка определяет пространство имен xmlns:x и сопоставляет ее со схемой, которая добавляет поддержку для типов кода программной части. Атрибут x:Class используется для связывания класса кода программной части с этой конкретной разметкой XAML. С учетом того, что этот атрибут объявлен в элементе <Window>, класс кода программной части должен наследовать от класса Window.

using System.Windows;

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!");
        }
    }
}
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

Метод InitializeComponent вызывается из конструктора класса кода программной части для слияния пользовательского интерфейса, определенного в разметке, с классом кода программной части. (InitializeComponent создается при построении приложения, поэтому реализовывать его вручную не нужно.) Сочетание x:Class и InitializeComponent гарантирует правильную инициализацию реализации при создании.

Обратите внимание, что в разметке элемент <Button> определил значение button_Click для атрибута Click. Благодаря тому что разметка и код программной части инициализированы и работают вместе, событие Click для кнопки автоматически сопоставляется с методом button_Click. По нажатию кнопки вызывается обработчик событий, а окно сообщения отображается при вызове метода System.Windows.MessageBox.Show.

На рисунке ниже показан результат нажатия на кнопку.

A MessageBox

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

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

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

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

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

  • размещение либо в окне, либо на странице;
  • наличие пользовательского интерфейса;
  • реализация некоторого поведения.

Более подробную информацию см. в разделе Элементы управления.

Функциональная классификация элементов управления WPF

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

Макет

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

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

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

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

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

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

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

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

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

В приведенном ниже примере элемент управления DockPanel используется для размещения нескольких элементов управления TextBox.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://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 page

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

Большинство приложений предоставляют пользователям возможность просматривать и редактировать данные. Для приложений WPF действия по хранению и доступу к данным уже предусмотрены в различных библиотеках доступа к данным .NET, таких как SQL и Entity Framework Core. После получения доступа к данным и их загрузки в управляемые объекты приложения WPF начинается самое сложное. Фактически этот процесс состоит из двух этапов:

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

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

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

Basic data binding diagram

WPF поддерживает объявление привязок непосредственно в разметке XAML. Например, следующий код XAML привязывает свойство Text класса TextBox к свойству Name объекта с помощью синтаксиса XAML "{Binding ... }". Предполагается, что свойству DataContext окна Window со свойством Name задан объект данных.

 <Window
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://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>

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

Более подробную информацию см. в разделе Общие сведения о привязке данных.

Графика и анимация

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

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

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

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

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

Двумерная графика

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

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

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

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

Illustration of different brushes

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

Трехмерная отрисовка

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

Visual3D sample screen shot

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

Анимация

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

Images of an animated cube

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

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

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

  • поддержка шрифтов OpenType;
  • усовершенствования ClearType;
  • высокая производительность за счет аппаратного ускорения;
  • интеграция текста с мультимедиа, графикой и анимацией;
  • поддержка международных шрифтов и резервных механизмов.

В качестве демонстрации интеграции текста с графикой на рисунке ниже показано применение эффектов оформления текста.

Text with various text decorations

Более подробную информацию см. в разделе Типографическая разметка в Windows Presentation Foundation.

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

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

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

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

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

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

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

Другие элементы управления, однако, могут содержать несколько объектов с различным типом содержимого. Содержимым элемента управления Button, определяемым свойством Content, могут быть различные объекты, в том числе элементы управления макетом, текст, изображения и фигуры.

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

Триггеры

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

Шаблоны

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

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

Например, кнопка Button при нажатии вызывает событие Click. Изменение шаблона кнопки для отображения фигуры Ellipse привело к изменению визуального представления элемента управления, однако его функция при этом осталась неизменной. Можно по-прежнему щелкнуть визуальный аспект элемента управления, и событие Click будет вызвано должным образом.

An elliptical button and a second window

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

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

A list box with the default appearance

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

List box that uses a data template

Элемент управления ListBox сохранил свое поведение и общий внешний вид. Изменилось только оформление содержимого, отображаемого в списке.

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

Стили

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

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

    <Window.Resources>
        <!-- Style that will be applied to all buttons for this window -->
        <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>
    </Window.Resources>
    <StackPanel>

        <!-- 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>
        
    </StackPanel>
</Window>

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

Two orange buttons

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

Ресурсы

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

В приведенном ниже примере определяется общий цвет фона для элементов управления Button и Label.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://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>

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

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

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

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

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

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

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

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

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

См. также