Understand the difference between XAML and Code-Behind, patterns with which you will implement your WPF app.
What is XAML?
XAML is an XML-based markup language that implements an application's appearance declaratively.
You typically use it to define windows, dialog boxes, pages, and user controls, and to fill them with controls, shapes, and graphics.
The following example uses XAML to implement the appearance of a window that contains a single button:
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>
Specifically, this XAML defines a window and a button by using the Window
and Button
elements. Each element is configured with attributes, such as the Window
element's Title
attribute to specify the window's title-bar text.
At run time, WPF converts the elements and attributes that are defined in markup to instances of WPF classes. For example, the Window
element is converted to an instance of the Window class whose Title property is the value of the Title
attribute.
The following figure shows the user interface (UI) that is defined by the XAML in the previous example:
Since XAML is XML-based, the UI that you compose with it's assembled in a hierarchy of nested elements that is known as an element tree. The element tree provides a logical and intuitive way to create and manage UIs.
Code-Behind
Code-Behind is the code that is associated with the XAML markup. Such type of code typically implement the behavior and logic of the application. For example clicking a menu or button, and calling business logic and data access logic in response.
The following example shows the updated markup from the previous example and the code-behind:
<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>
The updated markup defines the xmlns:x
namespace and maps it to the schema that adds support for the code-behind types. The x:Class
attribute is used to associate a code-behind class to this specific XAML markup. Considering this attribute is declared on the <Window>
element, the code-behind class must inherit from the Window
class.
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
is called from the code-behind class's constructor to merge the UI that is defined in markup with the code-behind class. (InitializeComponent
is generated for you when your application is built, which is why you don't need to implement it manually.) The combination of x:Class
and InitializeComponent
ensure that your implementation is correctly initialized whenever it's created.
Notice that in the markup the <Button>
element defined a value of button_click
for the Click
attribute. With the markup and code-behind initialized and working together, the Click event for the button is automatically mapped to the button_click
method. When the button is clicked, the event handler is invoked and a message box is displayed by calling the System.Windows.MessageBox.Show method.
The following figure shows the result when the button is clicked: