对于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))
1 <Style x:Key="SystemButton" TargetType="ButtonBase" BasedOn="{StaticResource SystemButtonBase}"> 2 <Setter Property="Width" Value="32" /> 3 <Setter Property="Height" Value="24" /> 4 <Setter Property="Foreground" Value="{DynamicResource ButtonText}"/> 5 <Style.Triggers> 6 <Trigger Property="IsMouseOver" Value="True"> 7 <Setter Property="Background" Value="{DynamicResource ButtonBackgroundHover}" /> 8 <Setter Property="Foreground" Value="{DynamicResource ButtonTextHover}"/> 9 </Trigger>10 <Trigger Property="IsPressed" Value="True">11 <Setter Property="Background" Value="{DynamicResource ButtonBackgroundPressed}" />12 <Setter Property="Foreground" Value="{DynamicResource ButtonTextPressed}" />13 </Trigger>14 <Trigger Property="IsEnabled" Value="false">15 <Setter Property="Foreground" Value="{DynamicResource ButtonTextDisabled}" />16 </Trigger>17 </Style.Triggers>18 </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的源生状。就是可以开始启动开源项目的学习了。