WPF是什么

WPF是微软的新一代图形引擎系统,全称为Windows Presentation Foundation,从.NET3.0版本开始引入,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法,它提供了统一的编程模型、语言和框架,真正做到了分离界界面设计人员与开发人员的工作,同时它提供了全新的多媒体交互用户图形界面。

WPF的核心理念是以数据驱动UI,传统的GUI界面都是由windows消息通过事件传递给程序,程序根据不同的操作来表达出不同的数据体现在UI界面上,这样数据在某种程度上来说,受到很大的限制。WPF中是数据驱动UI,数据是核心,处于主动的,UI从属于数据并表达数据,是被动的。WPF数据第一,控件第二。

WPF能做什么

WPF适合用于构建大型的桌面平台系统,比如我们目前熟知的开发工具Visual Studio,Blend,SqlServer客户端等的界面就是使用WPF技术实现。另外微软针对Windows App 10提出了适合跨设备应用程序开发的自适应控件方案(采用XAML-WPF的界面标记语言),相信WPF会在桌面应用程序开发方向走的更远。

WPF初体验

我们通过简单的两个示例,简单看一下WPF在界面表现及编程实现方面的优异之处,对WPF有一个最初的体验。

1、绘制一个圆角的控件/容器

爱美之心人皆有之,同样的功能实现,用户往往更关注的是界面表现,好的设计总是给人更多的吸引力,更有利于我们的产品推广。在实际的桌面程序开发过程中,经常会用到圆角布局,我们经常会把一些相关的控件或者图片放到一个圆角的容器中加以美化。假设我们需要得到一个如下图的界面(好吧,我承认并不美)。

WinForm下的实现方法大致如下:

a、添加一个Panel容器控件至窗体,并设置Panel的背景色为红色。

b、添加System.Drawing.Drawing2D命名空间引用,实现控件的圆角绘制方法。

        /// <summary>
/// 绘制圆角控件
/// </summary>
/// <param name="sender">要进行圆角绘制的控件对象</param>
/// <param name="p_1">主要是根据此参数确定边角点位置,可根据实际情况设置</param>
/// <param name="p_2">点与点之间连接线的弯曲程度</param>
private void Corner(Control sender, int p_1, double p_2)
{
GraphicsPath oPath = new GraphicsPath();
oPath.AddClosedCurve(
new Point[] {
new Point(, sender.Height / p_1),
new Point(sender.Width / p_1, ),
new Point(sender.Width - sender.Width / p_1, ),
new Point(sender.Width, sender.Height / p_1),
new Point(sender.Width, sender.Height - sender.Height / p_1),
new Point(sender.Width - sender.Width / p_1, sender.Height),
new Point(sender.Width / p_1, sender.Height),
new Point(, sender.Height - sender.Height / p_1) },(float)p_2); sender.Region = new Region(oPath);
}

c、添加Panel的Paint事件,实现Panel的圆角绘制。

        /// <summary>
/// Panel绘制
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void panel1_Paint(object sender, PaintEventArgs e)
{
Corner(this.panel1, , 0.1);
}

d、运行效果如下。

WinForm下实现圆角绘制基本上思路就是通过Point集合绘制,如果你发现绘制出来的圆角有锯齿的情况,那么你就想办法让点集更密集。除此之外,我们还可以通过调用Window API实现。

WPF实现方法:

我们只需新建一个WPF应用程序,修改MainWindow.Xaml文件为如下代码即可

<Window x:Class="CornerWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="" Width="">
<Grid Margin="">
<Border CornerRadius="" Background="Red" BorderBrush="Red"/>
<DockPanel> </DockPanel>
</Grid>
</Window>

运行效果如下:

从实现上来看,WPF要简便许多,而且圆角的效果没有锯齿现象,而且我们还可以将MainWindow.Xaml的代码进行简单的调整,很方便的实现阴影效果。

<Window x:Class="CornerWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="" Width="">
<Border>
<Border.Effect>
<DropShadowEffect Color="Black" Direction="" ShadowDepth="" Opacity="" />
</Border.Effect>
<Grid Margin="">
<Border CornerRadius="" Background="Red" BorderBrush="Red"/>
<DockPanel> </DockPanel>
</Grid>
</Border>
</Window>

2、编程实现体验

这里我们做一个只涉及界面逻辑的小例子,假如我们的需求是这样的:

要求界面上有一个TextBox,一个TracKBar(Winform)/Slider(WPF)控件,要求TextBox中输入的值跟TracKBar(Winform)/Slider(WPF)的值实现联动。

WinForm下的实现方法大致如下:

a、添加一个TextBox控件及一个TrackBar控件,按要求布局,设置TrackBar的MiniNum=0,MaxiNum=100(值为0~100);

b、添加TextBox的TextChanged事件,将TextBox的值赋值给TrackBar的Value属性。(没有对文本框输入进行验证,假设我们输入的都是符合要求的int型数据):

        /// <summary>
/// TextChanged
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void textBox1_TextChanged(object sender, EventArgs e)
{
trackBar1.Value = int.Parse(textBox1.Text);
}

c、添加TrackBar控件的Scroll事件,并实现(将TrackBar的Vlaue值赋给TextBox的Text属性)。

        /// <summary>
/// Scroll
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void trackBar1_Scroll(object sender, EventArgs e)
{
textBox1.Text = trackBar1.Value.ToString();
}

WPF下的实现方法:

将MainWindow.Xaml文件代码修改为如下即可。

<Window x:Class="CornerWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="" Width="">
<Border>
<Border.Effect>
<DropShadowEffect Color="Black" Direction="" ShadowDepth="" Opacity="" />
</Border.Effect>
<Grid Margin="">
<Border CornerRadius="" Background="Red" BorderBrush="Red">
</Border>
<DockPanel Margin="">
<TextBox x:Name="textBox" Height="" VerticalContentAlignment="Center" VerticalAlignment="Center" Width="" Margin="" Text="{Binding ElementName=slider, Path=Value}"/>
<Slider x:Name="slider" VerticalAlignment="Center" Minimum="" Maximum="" Value="{Binding ElementName=textBox,Path=Text}"></Slider>
</DockPanel>
</Grid>
</Border>
</Window>

从代码我们可看到,里面也TextBox,Slider等出现,我们也可以猜到这里应该是在定义控件。

本文旨在了解WPF的基本概念及WPF在各种实现上与WinForm的不同,具体WPF的MainWindow.Xaml文件中那一段类似于我们常见的XML格式的标记,就是WPF界面使用的XAML(Extensible Application Markup Language-可扩展应用程序标记语言)语言,它是微软为构建应用程序用户界面而创建的一种新的描述性语言,接下来让我们一起走进XAML的世界。

跟我一起学WPF(0):初识WPF的更多相关文章

  1. WPF从入门到放弃系列第一章 初识WPF

    什么是WPF WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供 ...

  2. DotNetCore 3.0 助力 WPF 开发

    DotNetCore Is AnyWhere. 前言 Visual Studio 2019 已经正式发布了,DotNetCore 3.0 的正式版也指日可待.在之前的版本中,作为一名基于微软生态的传统 ...

  3. Prism5.0开发人员指南内容 Contents of the Developer's Guide to Prism Library 5.0 for WPF(英汉对照版)

    The Prism for WPF guide contains the following topics: Prism指南包含以下内容: Download and Setup Prism 下载并安装 ...

  4. 下载并安装Prism5.0库 Download and Setup Prism Library 5.0 for WPF(英汉对照版)

    Learn what’s included in Prism 5.0 including the documentation, WPF code samples, and libraries. Add ...

  5. Prism开发人员指南5-WPF开发 Developer's Guide to Microsoft Prism Library 5.0 for WPF (英汉对照版)

    April 2014 2014四月   Prism provides guidance in the form of samples and documentation that help you e ...

  6. 一个基于Net Core3.0的WPF框架Hello World实例

    目录 一个基于Net Core3.0的WPF框架Hello World实例 1.创建WPF解决方案 1.1 创建Net Core版本的WPF工程 1.2 指定项目名称,路径,解决方案名称 2. 依赖库 ...

  7. [WPF]VS2019打包WPF程序

    原文:[WPF]VS2019打包WPF程序 版权声明:本文为本人原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37316917/article/details/8 ...

  8. WPF 精修篇 WPF 使用ActiveX

    原文:WPF 精修篇 WPF 使用ActiveX WPF 实现远程桌面功能 首先使用 开发人员命令提示 进入 自己的项目文件根目录下 输入 aximp C:\windows\System32\msts ...

  9. WPF 精修篇 WPF嵌入Winfrom控件

    原文:WPF 精修篇 WPF嵌入Winfrom控件 先增加DLL 支持 使用  WindowsFormsHost 来加载Forms的控件 引用命名空间 xmlns:forms="clr-na ...

随机推荐

  1. Struts2 01---环境搭配

    开发工具:Eclipse   Struts版本:2.3.24  最近在学SSH框架,SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架. ...

  2. HTTP 错误 500.19 请求的页面的相关配置数据无效 解决办法

    "HTTP 错误 500.19 请求的页面的相关配置数据无效" 解决办法   HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该 ...

  3. CF&&CC百套计划2 CodeChef December Challenge 2017 Total Diamonds

    https://www.codechef.com/DEC17/problems/VK18 #include<cstdio> #include<iostream> #includ ...

  4. CF869 C 组合

    先吐槽下,题面套的物语系列欸.. 由于距离为3,那么必定两种颜色间要填入第3种颜色,否则就是单独点的情况,那么两两之间可以单独考虑而不影响答案,枚举两种颜色之间边数,计算一边的组合和另一边的排列,最后 ...

  5. [转载]学习C语言基本思路与参考书籍

    http://zhuanlan.zhihu.com/linjr/19694823 计算机行业发展非常快,大学里的教育基本都跟不上实际的社会需求.如果你所在的学校还在指定大家使用谭浩强的教材,或使用VC ...

  6. Linux学习4-信号

      信号 信号是Unix和Linux系统响应某些条件而产生的一个条件.接收到该信号的进程会相应的采取一些行动. 信号是由于某些错误条件而生成的,如内存冲突,浮点处理器错误或非法指令等.它们由shell ...

  7. 【转】.NET中的三种Timer的区别和用法

    最近正好做一个WEB中定期执行的程序,而.NET中有3个不同的定时器.所以正好研究研究.这3个定时器分别是: //1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于 Windows 窗体应 ...

  8. python基础——python解析yaml类型文件

    一.yaml介绍 yaml全称Yet Another Markup Language(另一种标记语言).采用yaml作为配置文件,文件看起来直观.简洁.方便理解.yaml文件可以解析字典.列表和一些基 ...

  9. ES6简单总结

    1.变量声明let和const 我们都是知道在ES6以前,var关键字声明变量.无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部).这就是函数变量提升例如: functi ...

  10. [转]大整数算法[11] Karatsuba乘法

    ★ 引子         前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...