Translate

Sunday, 30 June 2013

What is XAML

XAML

XAML is an XML-based language for creating and initializing .NET objects. It’s used
in WPF as a human-authorable way of describing the UI, although you can use it for
a much larger range of CLR types than just those in WPF. Example 1-8 shows how
we declare the UI of our Window-derived class using XAML.

Example 1-8. Declaring a Window in XAML
<!-- Window1.xaml -->
<Window
x:Class="MyFirstWpfApp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Hello, WPF">
<Button
x:Name="button"
Width="200"
Height="25"
Click="button_Click">Click me, baby, one more time!</Button>
</Window>

The root element, Window, is used to declare a portion of a class, the name of which is
contained in the Class attribute from the XAML XML namespace (declared with a
prefix of “x” using the “xmlns” XML namespace syntax). The two XML namespace
declarations pull in two commonly used namespaces for XAML work, the one for
XAML itself (the one with the “x” prefix) and the one for WPF (which we’ve
declared as the default for this XML file). You can think of the XAML


Example . C# equivalent of XAML from Example 1-8 (continued)
void InitializeComponent( ) {
// Initialize Window1
this.Title = "Hello, WPF";
// Initialize button
button = new Button( );
button.Width = 200;
button.Height = 25;
button.Click += button_Click;
this.AddChild(button);
     }
   }
 }

XAML was built to be as direct a mapping from XML to .NET as possible. Generally,
a XAML element is a .NET class name and a XAML attribute is the name of a
property or an event on that class. This makes XAML useful for more than just WPF
classes; pretty much any old .NET class that exposes a default constructor can be initialized
in a XAML file.
Notice that we don’t have the definition of the click event handler in this generated
class. For event handlers and other initializations and helpers, a XAML file is meant
to be matched with a corresponding code-behind file, which is a .NET language code
file that implements behavior in code “behind” the look defined in the XAML. Traditionally,
this file is named with a .xaml.cs extension and contains only the things not
defined in the XAML. With the XAML from Example 1-8 in place, we can reduce
our single-buttoned main window code-behind file to the code in Example 1-10.

Example . C# code-behind file
// Window1.xaml.cs
using System;
using System.Windows;
using System.Windows.Controls;
namespace MyFirstWpfApp {
public partial class Window1 : Window {
public Window1( ) {
InitializeComponent( );
}
void button_Click(object sender, RoutedEventArgs e) {
MessageBox.Show(...);
  }
 }
}

Notice the partial keyword modifying the Window1 class, which signals to the compiler
that the XAML-generated class is to be paired with this human-generated class to form
one complete class, each depending on the other. The partial Window1 class defined in
XAML depends on the code-behind partial class to call the InitializeComponent
method and to handle the click event. The code-behind class depends on the partial
Window1 class defined in XAML to implement InitializeComponent, thereby providing
the look of the main window (and related child controls).
Further, as mentioned, XAML is not just for visuals. For example, nothing is stopping
us from moving most of the definition of our custom MyApp class into a XAML
file (Example 1-11).

This reduces the MyApp code-behind file to the event handler in Example 1-12.
You may have noticed that we no longer have a Main entry point to create the
instance of the application-derived class and call its Run method. That’s because WPF
has a special project setting to specify the XAML file that defines the application
class, which appears in the msbuild project file.

Example . Declaring an application in XAML
<!-- MyApp.xaml -->
<Application
x:Class="MyFirstWpfApp.MyApp"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="AppStartup">
</Application>
Example 1-12. Application code-behind file
// MyApp.xaml.cs
using System;
using System.Windows;
namespace MyFirstWpfApp {
public partial class MyApp : Application {
void AppStartup(object sender, StartupEventArgs e) {
Window window = new Window1( );
window.Show( );
  }
 }
}

Friday, 21 June 2013

Start with WPF

Window Presentation Format (WPF)


WPF is a completely new presentation framework, integrating the capabilities of
many frameworks that have come before it, including User, GDI, GDI+, and HTML,
as well as being heavily influenced by toolkits targeted at the Web, such as Adobe
Flash, and popular Windows applications like Microsoft Word. This chapter will
give you the basics of WPF from scratch, and then a whirlwind tour of the things
you’ll read about in detail in this Blog.

Building Applications In WPF


Building this application (Example 1-2) is a matter of firing off the C# compiler from
a command shell with the appropriate environment variables.* (The command line
here has been spread across multiple lines for readability, but you need to put it all
on one line.)

Example 1. Building a WPF application manually
C:\1st> csc /target:winexe /out:.\1st.exe
/r:System.dll
/r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\WindowsBase.dll"
/r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationCore.dll"
/r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\
PresentationFramework.dll"
MyApp.cs

Here, we’re telling the C# compiler that we’d like to create a Windows application
(instead of a Console application, which we get by default), putting the result, 1st.exe,
into the current folder, referencing the three main WPF assemblies (WindowsBase,
PresentationCore, and PresentationFramework), along with the core .NET System
assembly, and compiling the MyApp.cs source file.
Running the resulting 1st.exe produces the world’s lamest WPF application.

Example 2. A minimal msbuild project file
<!-- 1st.csproj -->
<Project
DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputType>winexe</OutputType>
<OutputPath>.\</OutputPath>
<Assembly>1st.exe</Assembly>
</PropertyGroup>
<ItemGroup>
<Compile Include="MyApp.cs" />
<Reference Include="System" />
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<Import Project="$(MsbuildBinPath)\Microsoft.CSharp.targets" />

</Project>

The msbuild tool is a .NET 2.0 command-line application that understands XML
files in the form shown in Example 2. The file format is shared between msbuild
and Visual Studio 2005 so that you can use the same project files for both commandline
and integrated development environment (IDE) builds. In this .csproj file (which
stands for “C# Project”), we’re saying the same things we said to the C# compiler—
in other words, we’d like a Windows application, we’d like the output to be 1st.exe
in the current folder, and we’d like to reference the System assembly and the main
WPF assemblies while compiling the MyApp.cs file. The actual smarts of how to turn
these minimal settings into a compiled .NET application are contained in the .NET

2.0 Microsoft.CSharp.targets file that’s imported at the bottom of the file.


Example 3. Building using msbuild (continued)
Target CoreCompile:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\Csc.exe /noconfig /nowarn:1701
,1702 /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0
\PresentationCore.dll" /reference:"C:\Program Files\Reference Assemblies\Microso
ft\Framework\v3.0\PresentationFramework.dll" /reference:C:\Windows\Microsoft.NET
\Framework\v2.0.50727\System.dll /reference:"C:\Program Files\Reference Assembli
es\Microsoft\Framework\v3.0\WindowsBase.dll" /debug+ /out:obj\Debug\1st.exe /tar
get:winexe MyApp.cs
Target _CopyFilesMarkedCopyLocal:
Copying file from "C:\Program Files\Reference Assemblies\Microsoft\Framework
\v3.0\PresentationCore.dll" to ".\PresentationCore.dll".
Copying file from "C:\Program Files\Reference Assemblies\Microsoft\Framework
\v3.0\System.Printing.dll" to ".\System.Printing.dll".
Copying file from "C:\Program Files\Reference Assemblies\Microsoft\Framework
\v3.0\PresentationCore.xml" to ".\PresentationCore.xml".
Copying file from "C:\Program Files\Reference Assemblies\Microsoft\Framework
\v3.0\System.Printing.xml" to ".\System.Printing.xml".
Target CopyFilesToOutputDirectory:
Copying file from "obj\Debug\1st.exe" to ".\1st.exe".
1st -> C:\1st\1st.exe
Copying file from "obj\Debug\1st.pdb" to ".\1st.pdb".
Build succeeded.
0 Warning(s)
0 Error(s)

Time Elapsed 00:00:04.15

WPF Applications

A real WPF application is going to need more than a message box. WPF applications
have an instance of the Application class from the System.Windows namespace.
The Application class provides methods like Run for starting the application, events
like Startup and SessionEnding for tracking lifetime, and properties like Current,
ShutdownMode, and MainWindow for finding the global application object, choosing
when it shuts down, and getting the application’s main window. Typically, the

Application class serves as a base for custom application-wide data and behavior.