WPF概述

  • 特性
  • 内置硬件加速
  • 分辨率无关特性
  • 体系结构
  • 类层次结构
  • WPF工具包
  • WPF详解介绍
  • 与WinForm比较
  • 创建WPF应用程序定义启动项
  • 关闭程序
  • Application对象的事件(程序启动到结束过程中的对应事件)
  • Application事件绑定方式


特性

内置硬件加速

winform的渲染使用User32和GDI /GDI+
User32:该部分为许多元素(如窗口,按钮和文本等)提供熟悉的windows外观。
GDI /GDI+:该部分为渲染简单形状,文本以及图像提供绘图支持,但是增加了复杂度(通用性较差)。

wpf的渲染使用DirectX,DirectX使用GPU加速
DirectX:显卡直接渲染的高度元素,如纹理和渐变,效率更高。

分辨率无关特性

wpf能够根据系统dpi的变化,自动计算出一个合适的窗口大小,包括窗口中的控件,及控件上的文字,所以若界面中使用图片,那么劲量使用矢量图,这样就能在缩小或放大时不失真。不同分辨率尺寸大小保持布标

体系结构

wpf使用GPU加速显示 wpf gpu_wpf

PresentationFramework.dll,包含WPF顶层的类型,包括哪些表示窗口、面板以及其他类型控件的类型。它还实现了高层编程抽象,如样式;开发中使用的大部分类都来自这个程序及;

PresentationCore.dll,包含基础类型,UIElement类和Visual,所有形状类和控件类都继承自这两个类;

WindowsBase.dll,包含更多基本要素,如DispatcherObject和DependencyObject类,这两个类引入了依赖属性;

milcore.dll,有时候称为“图形托管”引擎,是WPF渲染系统的核心,也是媒体集成层的基础;

类层次结构

wpf使用GPU加速显示 wpf gpu_应用程序_02

1、DispatcherObject类

通过继承自该类,用户界面中的每个元素都可以检查代码是否在正确的线程上运行,并能通过访问调度程序,为用户界面现成封送代码。

2、DependencyObject类

通过继承该类,WPF类可以获得对依赖属性的支持。

3、Visual类

WPF窗口中显示的每个元素本质上都是Visual对象。可以该类视为绘图对象,其中封装了绘图指令、如何执行绘图的附加细节,如透明度、裁剪以及变换位置,以及基本功能(命中测试);该类还在托管的WPF库和渲染桌面的milcore.dll程序及之间提供了链接,任何继承自该类的类都能在窗口上显示出来。因此,可以直接对该类进行编程也可以创建轻量级的用户界面。

4、UIElement类

该类增加了对WPF本质特征的支持,如布局、输入、焦点、和事件。

5、FrameworkElement类

该类是WPF核心继承树种的最后一站,实现了一些全部由UIElement类定义的成员。例如,UIElement为WPF布局系统设置了基础,但FrameworkElement类提供了支持它的重要属性,如HorizontalAlignment和Margin属性;UIElement类还添加了对数据绑定、动画以及样式等核心功能的支持。

6、shape类

基本的形状类。

7、Control类

是可以与用户进行交互的元素,包括TextBox、Button、ListBox等,该类为设置字体以及前景色与背景色提供了附加属性,并且支持模板,在WPF中可视化的被称为元素,只有和用户交互的称为控件,Panel类是所有布局容器的基类,定义在Control类中,但是不被认为控件。

8、ContentControl类

是所有具有单一内容的空间的基类,包括简单的标签乃至窗口的所有内容,该空间中的单一内容可以是普通字符串乃至具有其他形状和空间组合的布局面板。

9、ItemsControl类

是所有显示选项集合的控件的基类,如ListBox和TreeView控件。

10、panel类

是所有布局容器的基类,布局容器是一个可以包含一个或多个子元素、并按特定规则对子元素进行排列的元素。

WPF工具包

在将新的控件集成到.net平台的wpf库之前,通常先将控件放到被称为wpf工具包的microsoft下载中。例如wpf没有提供任何制图工具,但是wpf工具包提供了一套控件用于创建柱状图,饼状图,气泡图,散点图以及线型图。

WPF详解介绍

与WinForm比较

相同点:
WPF和 传统的WinForm 类似, WPF 同样需要一个 Application 来统领一些全局的行为和操作,并且每个 Domain (应用程序域)中只能有一个 Application 实例存在。
不同点:
WPF Application 默认由两部分组成 : App.xaml 和 App.xaml.cs,这有点类似于 Delphi Form(我对此只是了解,并没有接触过Delphi ),将定义和行为代码相分离。

创建WPF应用程序定义启动项

创建WPF应用程序有两种方式:

1:Visual Studio和Expression Blend默认的方式,由App.xaml文件定义启动应用程序

wpf使用GPU加速显示 wpf gpu_.net_03

2:自已定义类,由Main方法实现对WPF应用程序的启动

自定义类设定启动项:

public partial class App : Application
    {
        [STAThread]
        static void Main()
        {
            // 定义Application对象作为整个应用程序入口  
            Application app = new Application();
            // 方法一:调用Run方法,参数为启动的窗体对象 ,也是最常用的方法 
            Window2 win = new Window2();
            app.Run(win);

            // 方法二:指定Application对象的MainWindow属性为启动窗体,然后调用无参数的Run方法  
            //Window2 win = new Window2();  
            //app.MainWindow = win; 
            //win.Show();       
            // win.Show()是必须的,否则无法显示窗体
            //app.Run();  

            // 方法三:通过Url的方式启动
            //app.StartupUri = new Uri("Window2.xaml", UriKind.Relative); 
            //app.Run();
        }
    }

关闭程序

Application应用程序关闭:

OnLastWindowClose(默认值):

最后一个窗体关闭或调用Application对象的Shutdown() 方法时,应用程序关闭。

OnMainWindowClose

启动窗体关闭或调用Application对象的Shutdown()方法时,应用程序关闭。(和C#的Windows应用程序的关闭模式比较类似)

OnExplicitShutdown

只有在调用Application对象的Shutdown()方法时,应用程序才会关闭。

对关闭选项更改的时候,可以直接在App.xaml中更改:

<Application x:Class="WPFApplications.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window2.xaml"
    ShutdownMode="OnExplicitShutdown">
    <Application.Resources>
    </Application.Resources>
</Application>

同样你也可以在代码文件(App.xaml.cs)中进行更改,但必须注意这个设置写在app.Run()方法之前 ,如下代码:
app.ShutdownMode = ShutdownMode.OnExplicitShutdown;
app.Run(win);

Application对象的事件(程序启动到结束过程中的对应事件)

事件

描述

Activated

当应用程序成为前台应用程序时发生,即获取焦点。

Deactivated

当应用程序停止作为前台应用程序时发生,即失去焦点。

DispatcherUnhandledException

在异常由应用程序引发但未进行处理时发生。

Exit

正好在应用程序关闭之前发生,且无法取消。

FragmentNavigation

当应用程序中的导航器开始导航至某个内容片断时发生,如果所需片段位于当前内容中,则导航会立即发生;或者,如果所需片段位于不同 内容中,则导航会在加载了源 XAML 内容之后发生。

LoadCompleted

在已经加载、分析并开始呈现应用程序中的导航器导航到的内容时发生。

Navigated

在已经找到应用程序中的导航器要导航到的内容时发生,尽管此时该内容可能尚未完成加载。

Navigating

在应用程序中的导航器请求新导航时发生。

NavigationFailed

在应用程序中的导航器在导航到所请求内容时出现错误的情况下发生。

NavigationProgress

在由应用程序中的导航器管理的下载过程中定期发生,以提供导航进度信息。

NavigationStopped

在调用应用程序中的导航器的 StopLoading 方法时发生,或者当导航器在当前导航正在进行期间请求了一个新导航时发生(没大用到)。

SessionEnding

在用户通过注销或关闭操作系统而结束 Windows 会话时发生。

Startup

在调用 Application 对象的 Run 方法时发生

Application事件绑定方式

在App.xaml文件中:

<Application x:Class="WPFApplications.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml"
    Startup="Application_Startup"
    Exit="Application_Exit"
    DispatcherUnhandledException="Application_DispatcherUnhandledException">
    <Application.Resources>
         
    </Application.Resources>
</Application>

在App.xaml.cs文件中:

public partial class App : Application
{
    [STAThread]
    static void Main()
    {
          Application app = new Application();
          Window2 win = new Window2();
          app.Run(win);
    }

    private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.
DispatcherUnhandledExceptionEventArgs e)
    {  }

    private void Application_Exit(object sender, ExitEventArgs e)
    {  }
}