【WPF.NET开发】WPF.NET桌面应用开发概述

本文内容

  1. 为何从 .NET Framework 升级
  2. 使用 WPF 进行编程
  3. 标记和代码隐藏
  4. 输入和命令
  5. 控件
  6. 布局
  7. 数据绑定
  8. 图形和动画
  9. 文本和版式
  10. 自定义 WPF 应用

Windows Presentation Foundation (WPF) 是一个与分辨率无关的 UI 框架,使用基于矢量的呈现引擎,构建用于利用现代图形硬件。 WPF 提供一套完善的应用程序开发功能,这些功能包括 Extensible Application Markup Language (XAML)、控件、数据绑定、布局、二维和三维图形、动画、样式、模板、文档、媒体、文本和版式。 WPF 属于 .NET,因此可以生成整合 .NET API 其他元素的应用程序。

WPF 有两种实现:

  • 基于.Net 5 上运行。 适用于 XAML 设计器最低要求 Visual Studio 2019 版本 16.8。 但根据 .NET 的版本,可能需要使用较新版本的 Visual Studio,尽管 .NET 是一种跨平台技术,但 WPF 仅在 Windows 上运行。
  • 基于.NET Framework 4 版本,受 Visual Studio 2019 和 Visual Studio 2017 支持的 WPF 的 .NET Framework 实现。.NET Framework 4 是仅限 Windows 的 .NET 版本,被视为一个 Windows 操作系统组件。 此版本的 WPF 随 .NET Framework 一起分发。 

1、为何从 .NET Framework 升级

将应用程序从 .NET Framework 升级到 .NET 时,你将受益于:

  • 性能更好
  • 新的 .NET API
  • 最新语言改进
  • 改进的辅助功能和可靠性
  • 更新的工具及其他

2、使用 WPF 进行编程

WPF 作为 .NET 类型的一个子集存在,大部分位于System.Windows命名空间中。 如果你曾经使用 ASP.NET 和 Windows 窗体等框架通过 .NET 构建应用程序,应该会熟悉基本的 WPF 编程体验:

  • 实例化类
  • 设置属性
  • 调用方法
  • 处理事件

WPF 还包括可增强属性和事件的其他编程构造:
依赖项属性和路由事件

3、标记和代码隐藏

通过 WPF,可以使用标记和代码隐藏开发应用程序,这是 ASP.NET 开发人员已经熟悉的体验。 通常使用 XAML 标记实现应用程序的外观,同时使用托管编程语言(代码隐藏)来实现其行为。 这种外观和行为的分离具有以下优点:

  • 降低了开发和维护成本,因为特定于外观的标记与特定于行为的代码不紧密耦合。

  • 开发效率更高,因为设计人员在实现应用程序外观的同时,开发人员可以实现应用程序的行为。

3.1 标记

XAML 是一种基于 XML 的标记语言,以声明形式实现应用程序的外观。 通常用它定义窗口、对话框、页面和用户控件,并填充控件、形状和图形。

下面的示例使用 XAML 来实现包含一个按钮的窗口的外观:



  
  


具体而言,此 XAML 使用 Window 元素定义窗口,使用 Button 元素定义按钮。 每个元素均配置了特性(如 Window 元素的 Title 特性)来指定窗口的标题栏文本。 在运行时,WPF 会将标记中定义的元素和特性转换为 WPF 类的实例。 例如, Window 元素被转换为Window 
类的实例,该类的Title 
属性是 Title 特性的值。

下图显示上一个示例中的 XAML 定义的用户界面 (UI):

【WPF.NET开发】WPF.NET桌面应用开发概述_第1张图片

由于 XAML 是基于 XML 的,因此使用它编写的 UI 汇集在嵌套元素的层次结构中,称为元素树
。 元素树提供了一种直观的逻辑方式来创建和管理 UI。

3.2 代码隐藏

应用程序的主要行为是实现响应用户交互的功能。 例如,单击菜单或按钮,以及在响应中调用业务逻辑和数据访问逻辑。 在 WPF 中,在与标记相关联的代码中实现此行为。 此类代码称为代码隐藏。 下面的示例演示上一个示例的更新标记和代码隐藏:



  
  


更新的标记定义 xmlns:x 命名空间,并将其映射到为代码隐藏类型添加支持的架构。 x:Class 特性用于将代码隐藏类与此特定 XAML 标记相关联。 考虑此特性在  元素上声明,代码隐藏类必须从 Window 类继承。

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!");
        }
    }
}

从代码隐藏类的构造函数调用 InitializeComponent,以将标记中定义的 UI 与代码隐藏类合并在一起。 (生成应用程序时即会生成 InitializeComponent,因此不需要手动实现它。)x:Class 和 InitializeComponent 的组合可确保在创建实现时正确地对其进行初始化。

请注意,在标记中,

由于此样式针对所有 Button 控件,因此将自动应用于窗口中的所有按钮,如下图所示:

【WPF.NET开发】WPF.NET桌面应用开发概述_第11张图片

10.6 资源

应用程序中的控件应共享相同的外观,它可以包括从字体和背景色到控件模板、数据模板和样式的所有内容。 你可以对用户界面资源使用 WPF 支持,以将这些资源封装在一个位置以便重复使用。

下面的示例定义 Button 和 Label共享的通用背景色:



  
  
    
  

  
  

  
  

10.7 自定义控件

尽管 WPF 提供了大量自定义支持,但你仍可能会遇到现有 WPF 控件不满足你的应用程序或其用户的需求的情况。 出现这种情况的原因有:

  • 不能通过自定义现有 WPF 实现的外观和感觉创建所需的用户界面。
  • 现有 WPF 实现不支持(或很难支持)所需的行为。

但是,此时,你可以充分利用三个 WPF 模型中的一个来创建新的控件。 每个模型都针对一个特定的方案并要求你的自定义控件派生自特定 WPF 基类。 下面列出了这三个模型:

  • 用户控件模型
    自定义控件派生自UserControl 
    并由一个或多个其他控件组成。

  • 控件模型 自定义控件派生自Control,并用于生成使用模板将其行为与其外观分隔开来的实现,非常类似大多数 WPF 控件。 派生自 
    Control使得你可以更自由地创建自定义用户界面(相较用户控件),但它可能需要花费更多精力。

  • 框架元素模型
    当其外观由自定义呈现逻辑(而不是模板)定义时,自定义控件派生自 
    FrameworkElement。

你可能感兴趣的:(C#,.NET,专栏,wpf,.net)