WPF 杂谈——入门介绍
对于WPF的技术笔者是又爱又恨。现在WPF的市场并不是很锦气。如果以WPF来吃饭的话,只怕会饿死在街头。同时现在向面WEB开发更是如火冲天。所以如果是新生的话,最好不要以WPF为主。做为选择性来学习一下还是可以的。
WPF项目
在VS开发工具里面对于WPF应用相关的项目类型有三种。本来在笔者看来他可能会单独存在一个地方,后来想想也对,WPF也算是Window开发吧。那么WPF的三种项目类型都在模板Window节点下也是正常的。如下
对于"WPF 应用程序"项目相信大家都知道——执行项目。唯一笔者不明白的事为什么会有俩个控件库项目。明文上我们可以看到一个是用户,一个是自定义。那么俩者之间有什么不同的地方吗?笔者是这样子理解的:用法上来讲用户控件主要用于业务上的重用。这跟Winform用户控件有一点类似。很多控件都是当前存在的。土气讲就是把原本就有的控件拉到同一个框中组成了新的控件。而自定义控件则是在原来控件上在进一步的继承扩展。相当于说是一个全新的控件。功能上来讲不管理用户还是自定义俩者都可以实现对方的功能。但是在笔者看来自定义会来的深一些。自定义控件会去重新设定Style和Template。(为了更好的理解可以去 这里) 所以在新建项目之后会存在一定的差别。如下
用户控件项目
自定义控件项目
不管是WinForm开发还是WPF开发。我们都能看到Application类的影子。这种作法笔者真的不是很喜欢。很容易把俩者放在一起。新建一个WPF应用项目之后,会生成俩个Xaml文件。如下
App.xaml就是一个继承Application类的子类。对应的WPF运行都要通他来完成了。但是往往很有多人不是很喜欢WPF默认的这种方式。总是想要变成WinForm类似的方式启动。可能还是忘不了WinForm吧。至少笔者也有一点。如何去实现呢?
即然都是Window应用开发的话,笔者想一定离不开Main函数吧。可是笔者点开了相关的源码文件,硬是没有找到相应的Main函数。后来通过下面的方式找到了。原来在App.g.i.cs文件里面。也因此了解了。App.Xaml是有属性类型的。
所谓的属性类型是指App.xaml的属性中的“生成操作”部分。我们可以发现他默认是ApplicationDefinition。只要是ApplicationDefinition的话,他就是会默认生成Main函数。如下。
明白了上面的机制之后就简单多了。把App.xaml的属性设置成Page,同时创建一个叫Program类。代码如下。
public class Program
{
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public static void Main()
{
WpfApplication2.App app = new WpfApplication2.App();
app.InitializeComponent();
app.Run();
}
}
从上面的讲述中,我们可以知道一点:App.xaml好像是有种类的。如果是一个ApplicationDefinition的话,就可以启动项目直接调用。即是你把Main函数删除掉他也可以自动帮你生成。如果是Page的话,那就SORRY了。你必须自己手动增加Main函数。这对于一个.NET开发人员来讲并不难。正如笔者所讲的就跟Winfrom入口函数一个样子。
WPF界面
WPF在外观的编程做法是让笔者最满意的地方。他不在像传统WinForm那样子死板。而引入类似于B/S模式的方式。相信大家都听过CSS样式。没有错。很像。什么意思呢?WinForm的界面编辑可以说决对是一个很死板的方式。WPF界面引用了XAML来编辑。也许也正因为这样子才让界面更加的独立起来。同时让我们在美化界面更加的灵动和方便 。因为他也有一个跟HTML网页一样子的概念——样式(Style)。如下(引用于开源项目(Modern UI for WPF))
<Style x:Key="SystemButton" TargetType="ButtonBase" BasedOn="{StaticResource SystemButtonBase}">
<Setter Property="Width" Value="32" />
<Setter Property="Height" Value="24" />
<Setter Property="Foreground" Value="{DynamicResource ButtonText}"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource ButtonBackgroundHover}" />
<Setter Property="Foreground" Value="{DynamicResource ButtonTextHover}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{DynamicResource ButtonBackgroundPressed}" />
<Setter Property="Foreground" Value="{DynamicResource ButtonTextPressed}" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource ButtonTextDisabled}" />
</Trigger>
</Style.Triggers>
</Style>
上面只是定一个叫SystemButton的样式。主要用于修饰按扭的。他跟CSS样式的类样式有点类似。使用的话更不用说了。如下红色的SystemButton。
<Button x:Name="Maximize" Command="{Binding Source={x:Static SystemCommands.MaximizeWindowCommand}}" ToolTip="{x:Static modernui:Resources.Maximize}" Style="{StaticResource SystemButton}" >
我们都知道HTML网页如果想要引用CSS样式文件的话,就必须在头部声明引用。这样子才可以知道当前的界面是引用了哪一个CSS样式文件。不可否认WPF的界面同样子类似的。只是引用的文件不在叫CSS样式文件,而是叫资源文件。这个后续会笔者会在讲到。不过B/S和C/S本质上还是有一定的差别的。至少他可以声明一个作用于整个应用程序的资源文件。如下
<Application x:Class="FirstFloor.ModernUI.App.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.Light.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application
启动WPF应用程序就必须通过Application类或子类。执行Application类他会去寻找窗体。上面源码中StartupUri="MaiWindow.xaml"就体现出来了。当然不可能就必须这样子做。你们可以用代码来做。
在WinForm的时候,一个应用软件是有若干个Form组起的。而WPF界面则不一定哦。你可以是有一个Window和若干个UserControl或是若干个Page。至于你们选择哪一种方式来做的话,只要项目适合的话都可以。如果实在不清楚的话,你可以跟根据开源项目Modern UI for WPF来做。他就是一个Window和多个UserControl组成的。(Window相当于Form)
笔者开始入门的时候,并没有直接去查看开源项目。而是先把VS新建生成的了解了一遍。至少你要知道在什么地方启动。以什么样子的方式启动。界面又是什么入手的。明白了VS的源生状。就是可以开始启动开源项目的学习了。
WPF 杂谈——入门介绍的更多相关文章
- WPF自学入门(六)WPF带标题的内容控件简单介绍
在WPF自学入门(二)WPF-XAML布局控件的文章中分别介绍StackPanel,WarpPanel,DockPanel,Grid,Canvas五种布局容器的使用,可以让我们大致了解容器可以使用在什 ...
- WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍
WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式 ...
- WPF快速入门系列(1)——WPF布局概览
一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...
- WPF从入门到放弃系列第二章 XAML
本文是作者学习WPF从入门到放弃过程中的一些总结,主要内容都是对学习过程中拜读的文章的整理归纳. 参考资料 XAML 概述 (WPF):https://msdn.microsoft.com/zh-cn ...
- .NET读写Excel工具Spire.Xls使用(1)入门介绍
原文:[原创].NET读写Excel工具Spire.Xls使用(1)入门介绍 在.NET平台,操作Excel文件是一个非常常用的需求,目前比较常规的方法有以下几种: 1.Office Com组件的方式 ...
- WPF自学入门(十一)WPF MVVM模式Command命令
在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正如上一篇文章中在开始说的,MVVM的目的是为了最大限度地降低了 ...
- Python入门介绍
Python入门介绍(人生苦短,我用 Python) Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹 ...
- 书籍:wpf学习书籍介绍
WPF参考书推荐 下面先整理下,本人主要学习的WPF参考书: 1.WPF编程宝典(C#2010) 该书:(必读) 心得体会:读完该书后,你对WPF的基础和基本控件的使用,包括WPF的编程模型,相比Wi ...
- C# BackgroundWorker组件学习入门介绍
C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...
随机推荐
- Insertion Sort List Leetcode
Sort a linked list using insertion sort. 这个题我巧妙的设置了一个临时头结点 class Solution { public: ListNode* insert ...
- 1572: [Usaco2009 Open]工作安排Job
1572: [Usaco2009 Open]工作安排Job Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 814 Solved: 365[Submit ...
- 腾讯云数据库团队:MySQL数据库的高可用性分析
作者介绍:易固武,腾讯高级工程师,参与腾讯账号安全建设,腾讯数据仓库(TDW)优化改造,腾讯云数据库等项目,对大规模分布式存储和计算系统有浓厚的兴趣和经历 MySQL数据库是目前开源应用最大的关系型数 ...
- QT 的使用及编写代码遇到的问题和解决方法
QT 中将 QString 转化为 const char * 的问题 我开始的代码是这样的: QString qstr = "abcdef"; const char * cc = ...
- rip路由协议 细节分析及实例配置【完整版】
rip路由协议 细节分析及实例配置[完整版] RIP呢,这是一个比较重要的知识点,所以它的知识覆盖面很广泛:但是呢,我将会对碰到的问题进行一些分析解刨(主要是为了帮助自己理清思维):也希望能够从中发现 ...
- 关于js中两种定时器的设置及清除(转载)
1.JS中的定时器有两种: window.setTimeout([function],[interval]) 设置一个定时器,并且设定了一个等待的时间[interval],当到达时间后,执行对应的方法 ...
- Linux搭建FastFDFS文件管理系统搭建,部署及上传材料
昨天下午花了三四个小时在Linux centos 6 上搭建了一个分布式文件系统.纯粹是搭建来做自己的文件备份.所以把一些自己在其中遇到的一些问题给总结出来,免得更多人走错路. FastDFS 的一些 ...
- js中的call()、apply()和bind()方法的区别
call(thisObj,param1,param2....)方法:调用一个对象的方法,用另外的对象去替换当前对象. 下面给出一个例子: function add(a,b){ return a+b; ...
- js放大镜
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 在线阅读PDF文件js插件——pdf.js
最近接到一个需求大致是这样的,要求在移动端和pc端能够在线阅读pdf文件,类似百度文库的功能. 首先想到的就是插件,github(全球最大的男性交友网站- -恩)上一大堆啊,首先找到一个PDFobje ...