WPF 开发人员需要知道的一切
1 – 什么是 WPF?
WPF(Windows Presentation Foundation)是一个 .NET 类库,允许构建在 Windows 上运行的图形丰富的客户端程序。 WPF 应用程序既可以作为单独的窗口程序运行,也可以在 Web 浏览器中运行。
WPF 使用基于 3D 矢量的图形呈现图形元素,与屏幕分辨率无关。 WPF 使用 DirectX 来呈现图形元素,这使它能够利用硬件加速。如果硬件加速不可用,WPF 将使用软件而不是硬件呈现元素。 WPF 取代 Windows 窗体作为在 Windows 上创建客户端应用程序的编程环境。
2 – 渲染层
WPF 应用程序在运行时自动检查显卡功能并分配渲染层值,指示显卡可以执行哪些功能。
- 第 0 层 – 无硬件加速,所有渲染均使用软件完成
- 第 1 层 – 某些硬件加速可用。 DirectX 版本 >=9.0。
- 硬件加速:径向渐变
- 3D 光照计算
- 文本渲染
- 3D 抗锯齿
- 第 2 层 - 大多数功能使用硬件加速。 DirectX 版本 >= 9.0
要确定当前渲染层:
int renTier = (RenderCapability.Tier >> 16);
MessageBox.Show(string.Format("Tier = {0}", renTier));
3 – 开发 WPF 应用程序的工具
开发 WPF(版本 4)应用程序所需的唯一工具是 Visual Studio 2010。您可以免费下载 Visual Studio 2010 Express。 (对于单一的开发语言)。
要使用其他语言和其他平台(例如 64 位)开发应用程序,或利用其他高级功能,您需要付费版本的 Visual Studio 2010。
要获得用于设计用户界面的更高级功能,您还需要 Expression Blend 4。
4 – WPF 替换 Windows 窗体
Windows Presentation Foundation (WPF) 是 Microsoft 替代 Windows Forms 作为为 Windows 开发客户端应用程序的平台。将继续支持 Windows 窗体,但 WPF 是 Windows 客户端应用程序开发的未来。
WPF 提供了许多优于 Windows 窗体的优点,并且 Visual Studio 中用于 WPF 应用程序的工具现在非常出色。 (Visual Studio 2010)。
5 – 矢量图形和分辨率独立
在 WPF 中,您使用矢量图形而不是位图来渲染事物。您创建的内置控件和自定义控件都是如此。
不是想出一个位图模式来指定要在屏幕上绘制的每个像素,而是使用基本的图形基元绘制元素,例如形状、线条和多边形。
由于 WPF 使用矢量图形,因此用户界面元素将独立于实际设备分辨率进行呈现。 WPF 中图形元素的大小使用与设备无关的单位指定,其中每个单位为 1/96 英寸。这意味着用户界面元素将始终以指定的大小呈现,并且不受输出设备的像素密度 (DPI) 的影响。
6 – WPF 布局
WPF 使用基于流的布局模型来定位控件,而不是使用精确的像素坐标指定每个控件位置的基于坐标的模型。这是一种布局模型,类似于使用 CSS 布局网页的方式。
基于流的布局模型允许调整 WPF 控件以适应它们正在呈现的窗口。因此,WPF GUI 与大小和分辨率无关。 所有 WPF 控件都托管在一个容器中。
主要的基于流的容器有:
- DockPanel
- Grid
- StackPanel
- WrapPanel
7 – 基于属性的动画
动画是 WPF 的核心功能之一。与旧框架(如 Windows 窗体)不同,您不使用计时器来实现动画并逐帧渲染动画。相反,WPF 使用基于属性的动画,您可以通过声明性地指定其属性之一随时间的变化来为图形元素设置动画。
您可以通过编写代码或在 XAML 中以声明方式指定所需的动画效果来实现动画。您还可以使用 Blend 4 中的工具来创建 WPF 动画。
例如,下面是一段 XAML 代码片段,它定义了一个按钮,该按钮将改变其高度和宽度属性,永远扩展和收缩:
<Button Content="Click Me" Height="25" HorizontalAlignment="Left" Margin="25,25,0,0" Name="button1" VerticalAlignment="Top" Width="100" >
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="button1"
Storyboard.TargetProperty="Width"
From="100" To="105" Duration="0:0:0.3"
AutoReverse="True" RepeatBehavior="Forever"/>
<DoubleAnimation
Storyboard.TargetName="button1"
Storyboard.TargetProperty="Height"
From="25" To="30" Duration="0:0:0.5"
AutoReverse="True" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
8 – 音频和视频
WPF 使在您的应用程序中播放音频或视频内容变得非常容易。您可以播放 Windows Media Player 支持的任何媒体类型,包括 WAV 和 MP3 等音频格式或 AVI、WMV 和 MPG 等视频格式。
您可以通过在 XAML 中直接包含媒体 UI 元素来播放音频和视频。这允许在各种用户控件上渲染和播放视频。这是在 Button 表面播放的视频示例。
<Button Height="258" HorizontalAlignment="Left" Margin="26,21,0,0" Name="button1" VerticalAlignment="Top" Width="436" >
<Button.Content>
<MediaElement Source="C:\Users\Public\Videos\Sample Videos\Wildlife.wmv" Stretch="Fill"/>
</Button.Content>
</Button>
9 – 样式
在 WPF 中,样式是一组属性值,您可以在为多个控件设置类似属性时重用这些值。您可以将样式存储为资源,然后通过设置它们的 Style 属性将该资源应用于多个控件。
假设您有一组要应用于 UI 中多个按钮的属性。您可以先将新样式定义为静态资源:
<Window.Resources>
<Style x:Key="StdButton" TargetType="Button">
<Setter Property="Width" Value="100"/>
<Setter Property="Control.Background" Value="AliceBlue"/>
<Setter Property="Control.FontFamily" Value="Calibri" />
<Setter Property="Control.FontWeight" Value="Bold" />
</Style>
</Window.Resources>
然后,您可以使用各个 Button 控件的 Style 属性应用此样式:
<Button Content="I'm stylish" Style="{StaticResource StdButton}" />
<Button Content="Me Too" Style="{StaticResource StdButton}" />
<Button Content="Not me"/>
10 – 控制模板
与 WPF 中的样式类似,但不同的是模板。模板允许您在不改变其行为的情况下替换 UI 控件外观的所有方面。
WPF 中的每个控件都有一个完全指定其外观的默认模板。您可以使用您创作的模板替换默认模板,以更改控件的外观。
您可以通过更改其 Template 属性来更改控件的模板。这是我们创建一个新按钮模板的示例,该模板为按钮提供了一个粗蓝色边框。
<Window.Resources>
<ControlTemplate x:Key="Crazy" TargetType="Button">
<Border BorderBrush="Blue" Background="White" BorderThickness="3">
<ContentPresenter></ContentPresenter>
</Border>
</ControlTemplate>
</Window.Resources>
<Grid Height="auto" Width="503">
<StackPanel Height="100" HorizontalAlignment="Left" Margin="85,139,0,0" Name="stackPanel1" >
<Button Content="Crazy template" Template="{StaticResource Crazy}" />
<Button Content="Default template" />
</StackPanel>
</Grid>