WPF 开发人员需要知道的一切
51 – 资源
在 WPF 和 Silverlight 中,术语资源通常是指要在多个地方使用的 .NET 对象或值。资源是在 Silverlight 和 WPF 中重用的基本机制。
资源存储在资源字典中——由它们的键(通常是字符串值键)索引的资源对象的集合。
资源通常表示对象,例如:样式、模板、画笔和颜色。它们还可以表示故事板、变换或 3D 矩阵。
52 – 定义和使用应用程序范围的资源
WPF 资源可以与主 Application 对象相关联,如果您希望它们在整个应用程序中可用。
您可以在主应用程序 XAML 文件 (App.xaml) 中定义应用程序范围的资源。在下面的示例中,我们定义了一个绿色画笔。
<Application x:Class="WpfApplication.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml" Startup="Application_Startup" >
<Application.Resources>
<SolidColorBrush x:Key="greenBrush" Color="Green"/>
</Application.Resources>
</Application>
要使用此资源,请使用 XAML 扩展来引用静态资源。在下面的示例中,我们将主窗口中按钮的背景颜色设置为我们上面定义的绿色画笔。
<Window x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="224" Width="334">
<Grid>
<Button Content="Button" Background="{StaticResource greenBrush}"
Height="23" HorizontalAlignment="Left" Margin="60,57,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
53 – 从代码访问应用程序范围的资源
您可以使用 Application.Resources 属性从代码访问应用程序范围的资源。该属性指向包含 DictionaryEntry 对象集合的 ResourceDictionary。
对于 XAML 中定义的资源,每个条目的键是一个字符串,值是关联资源类型的对象。
例如,对于如下所示的 SolidColorBrush 资源:
<Application.Resources>
<SolidColorBrush x:Key="greenBrush" Color="Green"/>
</Application.Resources>
字典条目的 Key 是字符串“greenBrush”,Value 是一个 SolidColorBrush 对象,Color 属性设置为绿色。
SolidColorBrush br = (SolidColorBrush)Application.Current.Resources["greenBrush"];
54 – 应用程序的主窗口
创建至少一个窗口的 WPF 应用程序将始终具有一个主窗口。 Application.MainWindow 属性是对被认为是应用程序主窗口的引用。默认情况下,主窗口是第一个创建的窗口,但您可以在代码或标记 (XAML) 中更改 MainWindow 的值。
55 – Application.ShutdownMode
WPF 应用程序类有一个 ShutdownMode 属性,它根据关闭的窗口指示应用程序何时终止。 默认情况下,此属性的值为 ShutdownMode.OnLastWindowClose。
这表示应用程序将在您关闭所有窗口后终止。 您还可以将该属性设置为 ShutdownMode.OnMainWindowClose。
当您这样做时,您的应用程序将在您关闭其主窗口后立即终止,这将自动关闭该应用程序创建的任何其他打开的窗口。
56 – XAML
XAML(可扩展应用程序标记语言)是一种标记语言,用于在创建 WPF 或 Silverlight 应用程序时以声明方式定义应用程序的外观或行为的各个方面。 XAML 基于 XML 并使用类似 XML 的语法。
在 WPF 和 Silverlight 中,您通常使用 XAML 定义整个用户界面。这是一个例子,定义一个包含一个面板的窗口,该面板又包含两个按钮。
<Window x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="224" Width="334">
<StackPanel Orientation="Horizontal">
<Button Name="button1" Content="OK" Height="23" Width="75" />
<Button Name="button2" Content="Cancel" Height="23" Width="75" />
</StackPanel>
</Window>
XAML 标记(例如窗口、按钮)直接映射到 CLR 对象的实例,而 XAML 属性映射到这些对象的属性和事件。在此示例中,我们创建了 Button 类的两个实例,其 Content 属性的值为“OK”和“Cancel”。
57 – Markup vs. Code
WPF 或 Silverlight 用户界面通常使用标记 (XAML) 以声明方式指定。 XAML 指定要创建的控件及其属性应该是什么。但是这些控件也可以在代码中以程序方式创建(例如 C#)。
例如,请考虑以下在 StackPanel 中创建两个按钮的 XAML 代码:
<Window x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="224" Width="334">
<StackPanel Orientation="Horizontal">
<Button Name="button1" Content="OK" Height="23" Width="75" />
<Button Name="button2" Content="Cancel" Height="23" Width="75" />
</StackPanel>
</Window>
假设 Window 对象已经存在,上面的 XAML 将等效于以下 C# 代码:
private void Window_Initialized(object sender, EventArgs e)
{
StackPanel sp = new StackPanel();
sp.Orientation = Orientation.Horizontal;
Button b1 = new Button();
b1.Name = "button1";
b1.Content = "OK";
b1.Height = 23;
b1.Width = 75;
Button b2 = new Button();
b2.Name = "button2";
b2.Content = "Cancel";
b2.Height = 23;
b2.Width = 75;
sp.Children.Add(b1); // Add buttons to StackPanel
sp.Children.Add(b2);
this.Content = sp; // Add StackPanel to Window
}
58 – 其他使用 XAML 的地方
除了用于为 WPF 和 Silverlight 应用程序定义用户界面元素之外,XAML 还用于:
- 在 Windows Workflow Foundation 中定义工作流内容
- 在 Windows Communication Foundation 中定义服务
59 – Visual Studio 2010 中的 XAML
在典型的独立 WPF 应用程序中,新项目向导将为您的主 Application 对象以及您创建的任何 Window 派生对象生成 XAML。您可以在解决方案资源管理器的简单 WPF 应用程序中看到两个 .xaml 文件。
每个顶级 UI 类型都有一个 .xaml 文件,可以在 XAML 中实例化。每个还有一个关联的 C# 代码隐藏文件,其中将包含相同类型的 C# 实现代码。
如果双击 .xaml 文件之一,该对象的 XAML 代码将显示在设计器窗口的 XAML 选项卡上。
60 – Expression Blend 中的 XAML
您可以在 Visual Studio 2010 或 Expression Blend 4 中打开 WPF 解决方案。功能上有一些重叠,但这些工具的用途如下:
- Visual Studio – 开发人员 – 用于编写代码、测试、调试
- Blend – 设计人员 –用于设计用户界面和用户体验
因为您可以在 Blend 中打开项目,所以您还可以在 Blend 中查看和编辑项目用户界面元素的 XAML。
下面是一个解决方案在 Blend 中的样子:如果双击 MainWindow.xaml,将打开一个设计器,您可以在其中拖放 UI 元素。此窗口的右上角有一个小图标,您可以单击它来访问对象的 XAML:
这会将 MainWindow.xaml 窗口从设计图面切换到 XAML 编辑器,您将看到 MainWindow 对象的 XAML。