跟我一起学WPF(0):初识WPF
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的更多相关文章
- WPF从入门到放弃系列第一章 初识WPF
什么是WPF WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供 ...
- DotNetCore 3.0 助力 WPF 开发
DotNetCore Is AnyWhere. 前言 Visual Studio 2019 已经正式发布了,DotNetCore 3.0 的正式版也指日可待.在之前的版本中,作为一名基于微软生态的传统 ...
- 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 下载并安装 ...
- 下载并安装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 ...
- 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 ...
- 一个基于Net Core3.0的WPF框架Hello World实例
目录 一个基于Net Core3.0的WPF框架Hello World实例 1.创建WPF解决方案 1.1 创建Net Core版本的WPF工程 1.2 指定项目名称,路径,解决方案名称 2. 依赖库 ...
- [WPF]VS2019打包WPF程序
原文:[WPF]VS2019打包WPF程序 版权声明:本文为本人原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37316917/article/details/8 ...
- WPF 精修篇 WPF 使用ActiveX
原文:WPF 精修篇 WPF 使用ActiveX WPF 实现远程桌面功能 首先使用 开发人员命令提示 进入 自己的项目文件根目录下 输入 aximp C:\windows\System32\msts ...
- WPF 精修篇 WPF嵌入Winfrom控件
原文:WPF 精修篇 WPF嵌入Winfrom控件 先增加DLL 支持 使用 WindowsFormsHost 来加载Forms的控件 引用命名空间 xmlns:forms="clr-na ...
随机推荐
- (转) linux下vim和bash配置文件
1.注释版 ~/.vimrc "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限 set nocompatible set autoread " 文件修改之后自动载入 ...
- python字符中加入变量
有时候,我们需要在字符串中加入相应的变量,以下提供了几种字符串加入变量的方法: 1.+ 连字符 name = 'zhangsan' print('my name is '+name) #结果为 my ...
- poj 2125 Destroying The Graph (最小点权覆盖)
Destroying The Graph http://poj.org/problem?id=2125 Time Limit: 2000MS Memory Limit: 65536K ...
- 如何安装ioncube扩展对PHP代码加密
禅道专业版本的核心代码都是加密的(前端的html, css, js, 配置,语言项是开源的)的,使用的加密软件是 ioncube,因此要能运行禅道专业版本的软件,先要按照ioncube扩展. 一.下载 ...
- CF448C Painting Fence
传送门 Descriptionzed 最近总是受到 Farmer 的困扰,因此他在自家的门前插了一排栅栏以防农气的入侵.栅栏由 N 个竖条栅栏横向组成,每个竖条栅栏宽度为 1.过了一段时间,zed 觉 ...
- SQL 注入,永不过时的黑客技术
SQL 注入,永不过时的黑客技术 TalkTalk的信息泄漏事件导致约15万人的敏感信息被暴露,涉嫌造成这一事件的其中一名黑客使用的并不是很新的技术.事实上,该技术的「年纪」比这名15岁黑客还要大两岁 ...
- Centos6.5下搭建nagios详解
一.LAMP环境部署 1.安装php 1.安装yum源 rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-releas ...
- ActiveMQ与SpringMVC整合实现发送PTP和订阅发布消息功能
实现一个基于SpringMVC+JMS+ActiveMQ+Tomcat+JDK1.8+IDEA工具 ,Spring4.1.0和ActiveMQ5.15整合的实例,实现PTP和订阅/发布两种消息模型 一 ...
- 【技巧总结】Penetration Test Engineer[2]-Information gathering
2.信息收集 信息收集是属于前期交互阶段所需要了解的问题. 2.1.前期交互内容 签署授权文件:首要要和受测试方签订授权协议. 划定范围:指定了一个二级域名作为测试目标,那么其他二级域名在测试范围内. ...
- Error: No resource found that matches the given name (at 'icon' with value '@mipmap/Icon')
问题: error: Error: No resource found that matches the given name (at 'icon' with value '@mipmap/Icon' ...