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来完成这一功能 ...
随机推荐
- iOS 获取手机型号,系统版本
新添加判断iPhone 7.iPhone 7 Plus ,我手里没有7,判断不对表打我~ FQ找的资料:http://www.iphonehacks.com/download-iphone-ios-f ...
- Visual Studio 2017十五项新功能体验
Visual Studio 2017正式已经于2017.3.7号正式发布,选在这一天发布也是为了纪念Visual Studio 二十周年.MVP 2017技术峰会将于这个周末(3.17)在北京举办,由 ...
- Windows7 java-jdk1.7安装及设置变量过程
jdk安装的次数较少,容易忘记,这里专门记录一下. 1:jdk1.7网上到处都是可以随便下载一个.然后进行安装,不过在安装过程中把安装路径单独记忆一下,在配置变量的时候会用到. 2:安装完JDK后配置 ...
- 【Troubleshooting Case】Unable to delete Exchange database?
在我们日常邮件系统运维管理或实施部署变更中,经常会遇到,删除Exchange 数据库DB时,提示无法删除. ------------------– Microsoft Exchange Error - ...
- java与xml之间的转换(jaxb)
使用java提供的JAXB来实现java到xml之间的转换,先创建两个持久化的类(Student和Classroom): Classroom: package com.model; public cl ...
- iOS开发之判断横竖屏切换
/** * 当屏幕即将旋转的时候调用 * * @param toInterfaceOrientation 旋转完毕后的最终方向 * @param duration 旋转动画所花费的时间 */ ...
- deepin系统如何安装deb格式的软件
很简单,命令如下: sudo dpkg -i *.deb 记得路径要对
- Swift应用案例 2.闭包入门到精通
本文主要介绍Swift的闭包的使用并与OC的Block做比较.学习Swift是绕不过闭包的,因为无论是全局函数还是嵌套函数都是闭包的一种,本文主要介绍闭包表达式. 1.闭包表达式的使用 // 1. ...
- 浅谈对java中传参问题的理解
之前用的c/c++比较多,在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.在网上找了找,按我之前的理解,java中传 ...
- C++ 头文件系列(exception)
内容概览 一图解百问,但是有些地方我们需要特别指出: 类型在这里指通过typedef重定义的,例如函数类型.指针类型等. exception_ptr 在标准中是未定义具体实现的,因此它可能是类也可能是 ...