WPF The Hard Way

WPF The Hard Way

Windows Presentation Foundation (WPF) 是微软下一代显示系统,用于生成能带给用户震撼视觉体验的 Windows 客户端应用程序。 使用 WPF,您可以创建广泛的独立应用程序以及浏览器承载的应用程序。

WPF 的核心是一个与分辨率无关并且基于向量的呈现引擎,旨在利用现代图形硬件的优势。WPF 通过一整套应用程序开发功能扩展了这个核心,这些功能包括可扩展应用程序标记语言 (XAML)、控件、数据绑定、布局、二维和三维图形、动画、样式、模板、文档、媒体、文本和版式。WPF 包含在 Microsoft .NET Framework 中,使您能够生成融入了 .NET Framework 类库的其他元素的应用程序。

记得第一次接触WPF的时候正是微软 .NET3.0 release的时候,当时自己立刻被那些震撼的效果吸引了,当时自己写了好多的小程序去研究一些新奇的特性。但是由于自己所在的项目当时还主要是使用上一代的微软技术,为了保持界面的一致性,并没有引入WPF。当时WPF炒的很热,其子版本silverlight也是风生水起,时至今日,大浪淘沙,silverlight已经很少有人用了,代之以HTML5,但是作为微软的下一代界面,WPF却活了下来,据笔者所知,业内好多的客户端软件都是以WPF写成的,因为界面漂亮。

由于项目的原因,下一代的产品采用了WPF作为客户端的解决方案。好多人不太理解为什么是WPF,为什么不是HTML5,为什么不是ASP.NET MVC。首先从安全角度来说,WPF代表的是受信的代码,区别于浏览器中的代码,可以最大化的利用客户端资源,虽然云计算的概念炒的很火,但是对于某些行业来说,安全性和解决方案上面还是显得很蹩脚。

WPF中最重要的概念就是XAML和部分类,MFC和ATL中主要使用的.rc文件代之以XAML,相对于.rc文件,XAML有更强的表现能力和对GPU的操作能力,当然写出来的东西的也更炫。

<Window x:Class="WPFTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button  for Test" HorizontalAlignment="Left" Margin="193,140,0,0" VerticalAlignment="Top" Width="131" RenderTransformOrigin="-0.305,0.503" Height="29" Click="Button_Click_Test"/>
    </Grid>
</Window>

举例来说,如上代码就相当于在项目里面定义了一个window 和一个button,同时为button添加了一个onclick事件理程序,完全的XML结构,相对.rc更下清晰,在编译的时候,这段代码会编译为部分类的一部分,当然,作为设计的一部分,代码和UI应该是分离的所以代码部分看起来应该像是这样的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPFTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click_Test(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Please don’t click this button again");
        }
    }
}

除去固定的命名空间引入代码,简单的几行代码就完成了MFC中的Window结构定义,消息映射,消息函数声明,很多复杂的宏语句才能完成的功能,代码结构一目了然。

总结

在今天的Windows平台上开发客户端应用程序,如果需要炫丽的界面,WPF一定是你最佳的选择,不管从开发效率还是开发能力上,当然游戏开发不在本文的讨论范围之内,因为笔者对游戏开发没有过深入的研究。

时间: 2024-11-07 12:29:39

WPF The Hard Way的相关文章

WPF 依赖属性概念

理解依赖属性 在 WPF 中变成相比较于 传统 Windows Forms 变成发生了较大的改变. 属性现在以一组服务的形式提供给开发人员. 这组服务就叫做属性系统. 由 WPF 属性系统所支持的属性成为依赖属性. 依赖属性的概念 WPF 在依赖属性中提供了标准属性无法提供的功能, 特性如下: 决定属性值: 依赖属性的属性值可以在运行时有其他元素或者是其他信息所决定, 决定的过程具有一个优先次序. 自动验证或变更通知: 依赖属性哟一个自定的回调方法, 当属性值变更时被执行, 这个回调能验证新的值

wpf附加属性理解

WPF附加属性 http://www.cnblogs.com/tianyou/archive/2012/12/27/2835670.html WPF属性(二)附加属性 http://blog.csdn.net/iamsupercola/article/details/7069848 附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加属性的作用就是将属性与数据类型解耦,让数据类型的设计更加灵活. 这个解释的比较清

WPF窗体の投影效果

有时候我们需要给WPF窗体加上一个毛边(投影效果) 我们可以在窗体下加上如下代码 <Window.Effect> <DropShadowEffect BlurRadius="24" Color="#FF858484" Direction="90" ShadowDepth="3"/> </Window.Effect> 然后需要给窗体设置一个border BorderThickness=&quo

WPF笔记整理 - Bitmap和BitmapImage

项目中有图片处理的逻辑,因此要用到Bitmap.而WPF加载的一般都是BitmapImage.这里就需要将BitmapImage转成Bitmap 1. 图片的路径要用这样的,假设图片在project下的Images目录,文件名XXImage.png. pack://application:,,,/xxx;component/Images/XXImage.png 2. 代码: Bitmap bmp = null; var image = new BitmapImage(new Uri(this.X

WPF自定义控件与样式(11)-等待/忙/正在加载状态-控件实现

一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要有三种实现方式: 简单忙碌状态控件BusyBox: Win8/win10效果忙碌状态控件ProgressRing: 弹出异步等待框WaitingBox: 二.简单忙碌状态控件BusyBox 效果图: 通过属性"IsActive"控制控件是否启用,后台C#代码: /// <summary> /

企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) 译(2)

本书包含的章节内容 第一章:表现模式,以一个例子呈献给读者表现模式的发展历程,我们会用包括MVC和MVP在内的各种方式实现一个收费项目的例子.沿此方向,我们会发现每一种模式的问题所在,这也是触发设计模式发展的原因.本章还会说明如果应用不当,MVC和MVP这些依赖.Net事件的表现模式是怎么导致内存泄漏的.本章会谈论各种表现模式的优缺点,并且留给读者自我思考的问题,如为什么用MVVM设计模式来代替MVP或是MVC.第二章:介绍MVVM,包括使MVVM魅力四射的WPF和Silverlight的各种特

(WPF)属性值继承

属性值继承并不同于传统面向对象的类继承,而是指属性值自顶向下沿着元素树传递. 下面的代码在Window 元素上设置了Font属性.两个设置将会沿着逻辑树向下传递,并由子元素继承. 但是若子元素如设置了这样的属性,则不受其父元素设置的影响. <span style="font-size:14px;"> </span><span style="font-size:12px;"><Window xmlns = "http

C#入门分享(九)——WPF开发

WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模型.语言和框架,真正做到了分离界面设计人员与开发人员的工作:同时它提供了全新的多媒体交互用户图形界面.WPF可以更方便的开发更漂亮的界面,并且可以比以前更好地将GUI设计和程序逻辑分离开来,使得有条件的公司可以专门培养平面设计人员进行GUI设计(有点类似于与网页美工),而程序员更加关注业务逻辑. 下

《WPF揭秘》

书本上的东西没有理解体会就不是自己的,理解体会了没有学以致用很快又会忘到爪哇国,先把看过的书记录在这里,以后忘记了还可以来看看. 1.XAML Xaml是一种声明式的编程语言,是一种调用.Net的API的方式,在WPF应用程序中一般用它来生成界面. 在Xaml中为对象设置的事件处理程序总是在设置属性之后(Name属性除外,对象构造后立即设置). Xaml中有一种运行时根据字符串生成对象的表达方式叫做标记扩展(MarkupExtension). 由于花括号(“{”和“}”)代表标记扩展,如果向输入

WPF 中的 loaded 事件和 Initialized 事件

在 WPF 中, 控件有 Loaded 和 Initialized 两种事件. 初始化和加载控件几乎同时发生, 因此这两个事件也几乎同时触发. 但是他们之间有微妙且重要的区别. 这些区别很容易让人误解. 这里介绍我们设计这些事件的背景. (不仅适用于 Control 类, 同样在通用类如 FrameworkElement 和 FrameworkContentElement 类也适用.) 下面是个小故事: Initialized 事件只说: 这个元素已经被构建出来,并且它的属性值都被设置好了,所以