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))

 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的源生状。就是可以开始启动开源项目的学习了。

转载于:https://www.cnblogs.com/hayasi/p/6714292.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ModernUI(http://mui.codeplex.com/)是一个开源的WPF界面库,利用该界面库,我们可以创建很酷的应用程序。下面是ModernUI官方示例,你可以从官方网站直接下载源码运行,如果是.NET 4.0的话,记得要声明“NET4”预编译变量,否则无法编译通过。 这个界面框架是基于ModernUI来实现的,在该文我将分享所有的源码,并详细描述如何基于ModernUI来构造一个非常通用的、插件化的WPF开发框架。下载源码的同志,希望点击一下推荐。 本文将按照以下四点来介绍: (1)ModernUI简介; (2)构建通用界面框架的思路; (3)基于ModernUI和OSGi.NET的插件化界面框架实现原理及源码分析; (4)其它更有趣的东西~~。 要编写这样的WPF界面,我们需要在一个Window上声明菜单和Tab页面,下图是定义菜单的声明。 此外,每一个Tab风格页面,你也需要手动的为菜单创建这样的界面元素。 直接用这样的方式来使用ModernUI,显然不太适合团队协作性的并行开发,因为在一个团队的协作中,不同的人需要完成不同的功能,实现不同页面,每个人都需要来更改主界面。 我非常希望模块化的开发方法,因为这可以尽可能的复用现有资产,使程序员可以聚焦在自己关注的业务逻辑上,不需要关心UI的使用。下面,我将来描述基于ModernUI实现的一个通用界面框架,这个界面框架允许程序员在自己的业务模块中配置需要显示的界面元素。 通用界面框架实现思路: 我希望能够实现这样的通用界面框架: (1)程序员可以直接实现需要展现业务逻辑的界面,不需要关注如何使用ModernUI; (2)程序员可以通过简单的配置就可以将自己实现的业务逻辑页面显示在主界面中; (3)这个界面框架可以完全复用。 当我看到ModernUI这个界面库时,我希望将应用程序做成模块化,每一个模块能够: (1)通过以下配置能够直接显示二级菜单。 (2)通过以下配置能够直接显示三级菜单。 这样做的好处是,开发插件的时候可以不需要关心界面框架插件;团队在协作开发应用的时候,可以独立开发并不需要修改主界面;团队成员的插件可以随时集成到这个主界面;当主界面无法满足我们的布局时或者用户需求无法满足时,可以直接替换主界面框架而不需要修改任何插件代码。 最终的效果如下,以下界面的几个菜单及点击菜单显示的内容由DemoPlugin插件、DemoPlugin2插件来提供。当插件框架加载更多插件时,界面上会出现更多的菜单;反之,当插件被卸载或者被停止时,则相应的菜单将消失掉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值