По умолчанию вместе с файлом MainPage.xaml Visual Studio также создает файл отделенного кода (code-behind) MainPage.xaml.cs, который содержит логику на C#, связанную с файлом MainPage.xaml. Файлы XAML позволяют нам определить визуальный интерфейс, но для создания логики, например, для определения обработчиков событий элементов управления, все равно придется воспользоваться кодом C#.
Если мы посмотрим на файл MainPage.xaml.cs, то увидим, что он определяет частичный класс MainPage
:
public sealed partial class MainPage : Page
С помощью атрибута x:Class
объект Page в XAML ассоциируется с частичным классом, определенным в MainPage.xaml.cs. Затем при комплияции
компилятор соединяет оба файла в один класс.
Класс MainPage по умолчанию практически ничего не делает, кроме начальной инициализации компонентов:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; namespace HelloApp { public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required; } protected override void OnNavigatedTo(NavigationEventArgs e) { } } }
Через вызываемый в конструкторе метод InitializeComponent()
класс MainPage получает скомпилированный ранее код XAML, разбирает его и по нему строит графический интерфейс страницы.
В приложении часто требуется обратиться к какому-нибудь элементу управления. Для этого надо установить у элемента в XAML атрибут x:Name
.
Еще одной точкой взаимодействия между xaml и C# являются события. С помощью атрибутов в XAML мы можем задать события, которые будут связанны с обработчиками в коде C#.
Например, определим в XAML кнопку с двумя текстовыми полями:
<Page x:Class="HelloApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:HelloApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid> <TextBox x:Name="textBox1" Width="200" PlaceholderText="Введите сумму" /> <Button x:Name="button1" Content="Считать" Width="150" VerticalAlignment="Top" Margin="140 60 0 0" Click="button1_Click"/> <TextBlock x:Name="textBlock1" Width="150" Height="40" FontSize="24" VerticalAlignment="Top" Margin="40 120 20 0" /> </Grid> </Page>
И теперь мы можем добавить в файл отделенного кода метод button1_Click
- обработчик события Click:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; namespace HelloApp { public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required; } protected override void OnNavigatedTo(NavigationEventArgs e) { } private void button1_Click(object sender, RoutedEventArgs e) { double capital; if(Double.TryParse(textBox1.Text,out capital)) { capital+=capital * 0.12; textBlock1.Text = capital.ToString() + " долларов"; } } } }
Определив имена элементов в XAML, затем мы можем к ним обращаться в коде c#: string text = textBox1.Text
.
Хотя XAML позволяет довольно просто создавать элементы, но мы можем также определять элементы динамически в коде c#. Например, пусть элемент Grid в XAML имеет следующее имя:
<Grid x:Name="grid1"> </Grid>
Теперь в файле отделенного кода в конструкторе MainPage можно добавить в этот грид разные элементы:
public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required; Button button2 = new Button(); button2.Width = 100; button2.Height = 30; button2.Content = "Кнопка2"; grid1.Children.Add(button2); }
Это аналогично тому, как если бы создали ту же кнопку через xaml:
<Grid x:Name="grid1"> <Button x:Name="button2" Content="Кнопка" Width="100" Height="30" /> </Grid>