Что такое WPF и чем он отличается от WinForms?
Начинаю изучать десктоп-разработку на C#. Постоянно встречаю аббревиатуру WPF (Windows Presentation Foundation), но не понимаю, что это и почему все советуют его вместо WinForms. Можете объяснить простыми словами, что такое WPF и в чём ключевая разница?
2 ответа
WPF (Windows Presentation Foundation) — это технология/фреймворк от Microsoft для построения desktop-интерфейсов под Windows на платформе .NET. Появилась в 2006 году как более современная замена WinForms.
Главные отличия от WinForms:
| WinForms | WPF | |
|---|---|---|
| Разметка UI | код на C# | декларативный XAML |
| Отрисовка | GDI+ (пиксели) | DirectX (вектор) |
| Масштабирование | пиксельное, плывёт на HiDPI | векторное, чёткое на любом DPI |
| Привязка данных | примитивная | мощный Binding + MVVM |
| Стилизация | ограниченная | стили, шаблоны, темы |
| Анимации | вручную | встроенные |
Ключевая идея WPF — разделение интерфейса (XAML) и логики (C#). Дизайнер может рисовать в XAML, а программист писать код отдельно.
Минимальное окно на XAML выглядит так:
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Привет, WPF" Height="200" Width="300">
<StackPanel>
<TextBlock Text="Hello, WPF!" FontSize="24" Margin="10"/>
<Button Content="Нажми меня" Click="Button_Click"/>
</StackPanel>
</Window>
А обработчик в code-behind:
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Кнопка нажата!");
}
Коротко: WinForms проще для старта и крошечных утилит, WPF мощнее, лучше масштабируется и заточен под MVVM — выбирай WPF для серьёзных проектов.
Добавлю практическую заметку: WPF использует векторную отрисовку через DirectX, поэтому на мониторах с высоким DPI (4K, ноутбуки с масштабом 150%) интерфейс остаётся чётким, а у WinForms часто всё мылится и плывёт.
Ещё важно: для WPF почти обязательно освоить паттерн MVVM и привязку данных, иначе вы не получите всех преимуществ и будете писать тот же код-бихайнд, что и в WinForms. Так что закладывайте время на изучение Binding и INotifyPropertyChanged.