当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪Windows 8文件关联和程序合约          在windows系统中,我们经常会遇到这样的情况,比如想打开一个图片文件,我们点击鼠标右键,在右键选项中,我们一般会选择打开方式,然后选择能打开图片的应用程序。今天将介.........
    ▪Winform开发框架之通用定时服务管理      做项目的时候,或多或少需要和其他外部系统或者接口进行数据交互,有些是单向的获取,有些可能是修改状态后再写回去,不管如何,这个都可以称之为数据同步操作,如人员信息同步、业.........
    ▪WPF:使用Json.NET在TreeView中树形显示JSON数据      效果如下: (每一个项目中的左侧黑字是数据的值,右侧灰字是数据的类型。对于对象或数组,黑字会显示对象的属性个数或数组的成员个数) (上图中的JSON数据来自:http://www.jsonexample..........

[1]Windows 8文件关联和程序合约
    来源:    发布时间: 2013-10-22

    在windows系统中,我们经常会遇到这样的情况,比如想打开一个图片文件,我们点击鼠标右键,在右键选项中,我们一般会选择打开方式,然后选择能打开图片的应用程序。今天将介绍如何将我们的应用程序注册为这样的一个程序,当我想打开图片,然后再打开方式中选择我们自己的应用程序,来打开图片。如下图:

1.文件关联

  1).  注册打开确定的文件类型

   当程序打开的文件类型适合于我们的程序时,要想在上面的列表中看到我们的程序,操作起来很简单,只需要修改一下项目中package.appxmanifest文件即可。打开Package.appxmanifest文件,选择"声明"选项卡。在“可用声明”选择列表中,选择“文件类型关联”,然后点击添加。这时,你会看到右边一个新的表单显示在屏幕上,这个表单是与文件关联相关的。默认情况下,这里会有几个红色的X,需要你来填写相关内容。如下图:

  在支持的文件类型选项中,我们可以设置成我们自己的文件类型,比如(.win)。 微标是当一个程序是某个文件类型的默认打开程序时,我想要显示自己的logo 或者icon,就像Excel有一个Excel图标,为了达到这个效果,打开package.appxmanifest文件,在指定name的地方,指定一个logo,即可。

  当你做完了上面的步骤,那么基本的工作就完成了。现在运行一次程序,将其安装到你的系统中,然后尝试使用“打开方式”打开一个指定的类型。选择一个图片,然后再打开方式中就可以看到我们的应用程序了。

  2).  处理打开的文件。

  当我们通过选择打开方式,打开一个图片后,怎样在我们的应用程序中显示出来呢?此时,我们应该做如下工作:

     在程序的App.xaml.cs文件中,可以通过重写Application中的OnFileActivated方法,来捕获打开文件的事件,并做相应的处理,如下代码:

     protected override void OnFileActivated(FileActivatedEventArgs args)

     {

          Frame frame = Window.Current.Content as Frame;

              if (frame == null)

             {

                   frame =new Frame();             

              Window.Current.Content = frame;

            }

         if (!frame.Navigate(typeof(MainPage), args))

            {

                   throw new Exception("Failed to create initial page");

            }

           

    
[2]Winform开发框架之通用定时服务管理
    来源:    发布时间: 2013-10-22

做项目的时候,或多或少需要和其他外部系统或者接口进行数据交互,有些是单向的获取,有些可能是修改状态后再写回去,不管如何,这个都可以称之为数据同步操作,如人员信息同步、业务数据同步、第三方接口数据同步等等。

数据同步涉及到一个同步时间的问题,一般不敏感的数据,一天或者一周左右同步一次就可以了,有些可能需要间隔更短一点。

同步的逻辑不同,有些可能写数据库就可以了,有些可能需要访问WebService或者其他接口,然后在进行数据获取,保存等操作,回写的时候,也一般是调用WebService这样的接口修改数据。

每个同步实现我们都需要做大量重复性工作,如Windows服务安装、卸载、或者基础性的工作,有没有一种方式可以隔离业务逻辑和常用的东西呢?

1、通用定时服务管理模块设计

这样的同步操作看似没有很多必然的关联性,但是,这些都是很常见的东西,如果以插件架构方式来组织各个不同的业务封装,通过参数配置实现同步间隔不同,核心的同步模块其实是很多类似的东西,而同步一般通过Windows访问进行,这样通用的我们可以把它封装成一个通用的Windows服务。再辅以一个界面管理模块来管理服务的安装、卸载、启动、停止、测试等操作就可以了,整个Window服务的插件设计框架如下所示。

Windows定时服务-文件视图如下所示:

以上架构,有几个特点,

1、 基于插件结构,扩展容易。

2、 一个定时服务【通用的WIndows服务模块】,可以同时运行很多个不同的定时规则的定时服务应用。

3、 一个通用的服务管理界面【Windows定时服务管理】,来对定时服务的安装、卸载、启动、停止、测试等操作,并且可以对插件进行可视化配置。

4、【通用的WIndows服务模块】提供参数化安装,卸载、测试的功能。

5、【Windows定时服务管理】提供DOS测试和WInform进度测试的集成。

6、 插件参数化配置,提供插件各种参数的配置,统一调度。

6、插件通过反射加载不同的定时服务应用,实现松耦合和强类型接口的转换,确保弹性化和安全性。

7、整个定时服务管理模块,可以在不同的场合下实现重用,每次只是定时服务应用的不同而已。

8、定时时间设置,提供多样化的设置,可以在间隔时间、每天整点运行、每月指定日期时间运行多种方式。

整个定时服务管理通用模块,可以最大化的实现工具重用、逻辑重用,不管业务场景如何变化,基本上不需要调整了,只需要把定时服务应用ABC模块开发好,参数配置好,丢进去就可以了。

 

2、定时服务控制台【Windows定时服务管理】的界面设计

开发好的【Windows定时服务管理】界面如下所示,运行后,会把XML文档里面的插件加载在下面的列表中,供查看和修改操作。

插件的XML配置信息如下所示。

<?xml version="1.0"?>
<ArrayOfPlugInSetting>
<PlugInSetting>
<!--插件程序名称-->
<Name>测试名称</Name>
<!--插件描述内容-->
<Description>测试描述</Description>
<!--运行同步服务的间隔时间(单位:分钟)-->
<ServiceCycleMinutes>1</ServiceCycleMinutes>
<!--Windows服务在固定时刻(0~23时刻)运行-->
<ServiceRunAtHour>23</ServiceRunAtHour>
<!--Windows服务在每月指定天运行,小时按ServiceRunAtHour的值-->
<ServiceRunAtDay>1</ServiceRunAtDay>
<!--运行模式,0为间隔分钟运行 1为固定时刻运行, 2为按月某天和小时 其他值为禁用-->
<RunMode>0</RunMode>
<!--插件的类型名称:插件类名,程序集名称-->
<PlugInTypeName>WHC.PlugInService.ClassName,WHC.PlugInService</PlugInTypeName>
</PlugInSetting>
</ArrayOfPlugInSetting>

单击安装服务,控制台程序调用DOS命令+参数来实现通用定时WIndows服务的安装。

安装后,系统的Windows服务列表中就会增加一个【定时服务】的服务模块了,这样就证明我们顺利安装了通用定时服务了。

定时服务控制台的状态也会同时刷新,并且把服务的状态和类型显示在【服务状态】里面,这个时候,可以对服务进行卸载、测试、停止服务、重新启动、刷新状态等相关操作了。

如果对于很多定时服务应用,每种需要进行动态的禁用或者设置定时方式,那么可以在列表上右键进行相关的操作。

 

3、定时应用测试及界面集成

在开发过程中,发现经常性的需要调试我们自己的定时应用ABC是否正确生成,可以通过【DOS测试】和【进度测试】这两个按钮进行逻辑测试,这个没有触发Windows的情况下进行调用,可以看到具体的效果如下所示。

一般来说,提供以上DOS窗口来进行跟踪调试就可以了,但是有时候,我们想在Winform程序中调用立即同步的操作的时候,可以使用进度测试的逻辑代码进行处理,这样可以在主界面中显示进度。

由于是插件架构,因此在和Winform集成的时候,其实是和这个定时服务控制台一样,我们在我们的Winform程序中,加载应用插件,进行调用就可以了,调用代码如下所示。

private void btnTestProgress_Click(object sender, EventAr
    
[3]WPF:使用Json.NET在TreeView中树形显示JSON数据
    来源:    发布时间: 2013-10-22

效果如下:

(每一个项目中的左侧黑字是数据的值,右侧灰字是数据的类型。对于对象或数组,黑字会显示对象的属性个数或数组的成员个数)

(上图中的JSON数据来自:http://www.jsonexample.com/ 中的最下面的示例JSON)

 

具体实现方法是通过利用Json.NET中的Json对象基类:JToken类型,在Newtonsoft.Json.Linq命名空间内,这个类型的派生类型有:

 

JValue类型代表着一个Json数据值,也就是不会再有子节点的原子值。

而另一个JToken的直接继承者是JContainer类型,代表数据对象有子节点,它的派生类型:JProperty,JObject和JArray分别代表属性,对象和数组。

 

我最初想到的是用JToken类型的Type属性来构建树,但是随后发现JTokenType的定义完全平面化,不利于不同类型成员结构的创建,于是采用直接判断JToken对象类型的方式来构建树。也就是直接根据不同JToken类型来生成其相应的成员节点数据。

 

整个树的数据类型由一个类型来完成,名称是JsonHeaderLogic,它定义三个属性:

public string Header { get; private set; }

public IEnumerable<JsonHeaderLogic> Children { get; private set; }

public JToken Token { get; private set; }

Header是当前节点的显示文字。

Children是子节点。(如果没有的话值是null)

Token是原始的Json.NET中的JToken对象。

 

那么在界面上,我们就可以直接使用WPF中TreeView和HierarchicalDataTemplate来这样定义DataTemplate:

<TreeView Name="treeView">

    <TreeView.ItemTemplate>

        <HierarchicalDataTemplate ItemsSource="{Binding Children}">

            <StackPanel Orientation="Horizontal">

                <!-- 显示Header属性 -->

                <TextBlock Text="{Binding Header}"/>

                <!-- 显示JToken的Type属性 -->

                <TextBlock Text="{Binding Token.Type}" Margin="10 0 0 0" Foreground="Gray"/>

            </StackPanel>

        </HierarchicalDataTemplate>

    </TreeView.ItemTemplate>

</TreeView>

 

JsonHeaderLogic类型的完整定义:

//+ using Newtonsoft.Json.Linq;

class JsonHeaderLogic

{

    //用于对应Json对象类型的格式化字符

    const string NULL_TEXT = "<null>";

    const string ARRAY = "[{0}]";

    const string OBJECT = "[{0}]";

    const string PROPERTY

    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3