Построение приложения WPF используя только код
37WPF --- Основа WPF --- Построение приложения WPF используя только код
Как вам уже известно, XAML и WPF — это две разные, хотя и взаимодополняющие технологии. В результате вполне возможно создать приложение WPF, в котором не используется XAML.
В общем случае существуют три разных стиля кодирования, которые могут применяться при создании приложения WPF:
- Только код
Это традиционный подход, используемый в Visual Studio для приложений Windows Forms. Пользовательский интерфейс в нем генерируется операторами кода.
- Код и не компилированная разметка (XAML)
Это специализированный подход, который имеет смысл в определенных сценариях, когда нужны исключительно динамичные пользовательские интерфейсы. При этом часть пользовательского интерфейса загружается из файла XAML во время выполнения с помощью класса XamlReader из пространства имен System.Windows.Markup.
- Код и компилированная разметка (BAML)
Это предпочтительный подход для WPF, поддерживаемый в Visual Studio. Для каждого окна создается шаблон XAML, и этот код XAML компилируется в BAML, после чего встраивается в конечную сборку. Во время выполнения скомпилированный BAML извлекается и используется для регенерации пользовательского интерфейса.
Разработка на основе только кода — наименее распространенный (но полностью поддерживаемый) путь написания приложений WPF без применения какого-либо XAML-кода. Очевидным недостатком разработки на основе только кода является то, что этот вариант потенциально чрезвычайно утомителен. Элементы управления WPF не включают параметризованных конструкторов, поэтому даже добавление простой кнопки в окно требует нескольких строк кода. Одним потенциальным преимуществом разработки на основе только кода является ограниченное пространство для настройки.
Например, можно сгенерировать форму, заполненную элементами управления вводом, на основе информации из записи базы данных, или же можно на основе какого-то условия принять решение, добавлять или подставлять элементы управления в зависимости от текущего пользователя. Все, что для этого потребуется — это логика проверки условия и ветвление. И напротив, когда используемые документы XAML встраиваются в сборку как фиксированные, неизменные ресурсы.
Несмотря на то что вы вряд ли будете создавать WPF-приложения на основе только кода, вы, скорее всего, воспользуетесь этим подходом для создания элемента управления WPF в некоторой точке, когда нужна адаптируемая порция пользовательского интерфейса. Ниже представлен пример:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;
namespace WpfApplication1
{
public class Class1 : Window
{
private Button Btn1;
public Class1()
{
InitializedComponent();
}
private void InitializedComponent()
{
// Новая форма
this.Width = this.Height = 300;
this.Left = this.Top = 100;
this.Title = "Моя кнопка";
// Переходим к компоновке
DockPanel panel = new DockPanel();
Btn1 = new Button();
Btn1.Content = "Кликни меня!";
Btn1.Margin = new Thickness(40);
// Обработчик события клика
Btn1.Click += btn1_Click;
IAddChild container = panel;
container.AddChild(Btn1);
container = this;
container.AddChild(panel);
}
private void btn1_Click(object sender, RoutedEventArgs e)
{
Btn1.Content = "Спасибо!";
}
}
}
Концептуально класс Class1 в этом примере сильно напоминает форму из традиционного приложения Windows Forms. Он наследуется от базового класса Window и добавляет приватную переменную-член для каждого элемента управления. Для ясности этот класс выполняет свою работу по инициализации в выделенном методе InitializeComponent().