CMDCalendar-个人技术文档

概述

     本文档主要讲述在下在CMDCalendar中所做的一些工作,其中包括 做了什么模块,采用了什么技术,为什么选择采用这些技术,在使用这些技术上遇到的一些问题和解决的办法。

场景

    工作项序号:001 子窗口任务日程列表多窗口的实现

    背景:

         典型用户:

                    âçªé²è¯ºâçå¾çæç´¢ç»æ

                    汤星·奇露诺 

                    作为我们的用户,在主界面安排并且设置了很多的日程和任务之后,希望能够比较便捷的确认自己现在的日程和任务,但是又不想打开主界面,而是希望有一个窗口能够只显示最近的日程和任务,便于自己确认。

功能说明书:

          采用了什么技术:为了实现上述背景中提到的功能,我采用了多窗口的技术。

          为什么选择多窗口的技术:首先我需要一个能够承载一个XAML页面的容器,所以我们能够选择的有简单的页面跳转,多窗口技术和ContentDialog,然而ContentDialog虽然能够显示一个XAML,并且行为也与想实现的悬浮窗的感觉很相似,然后遗憾的是首先这个ContentDialog无法独立于其父窗口存在,之后是用户无法对ContentDialog进行移动,导致用户没有办法相对独立的使用这个ContentDialog,所以首先放弃了使用ContentDialog的想法。之后就是页面跳转和多窗口技术之间的抉择,在考虑到可能有用户同时使用主界面和多窗口的使用场景后,我最终决定使用多窗口技术来实现这个显示最近日程和任务以便确认的页面。

          使用多窗口技术时遇到的问题和解决的办法:

          首先是基本的创建一个子窗口,只要先声明一个新的窗口,之后将这个窗口进行激活,激活之后再获取新窗口的唯一ID(窗口的唯一标识),之后调用ApplicationViewSwitcher.SwitchAsync或者TryShowAsStandaloneAsync方法来打开子窗口,前面的方法是在父窗口的位置出打开子窗口,所以是Switch方法。而后面的方法是在父窗口的旁边打开子窗口,所以是TryShowAsStandAlone,想想一下你去请教老师问题的时候站在老师边上的场景,就能想象到这两个方法的差别和实现方法。

         第二个遇到的问题是用户一直在父窗口中点击生成子窗口的按钮会出现N个子窗口,但是每个子窗口的内容都是一样的,用户的这种行为可能只是想唤起最小化的子窗口或者将子窗口置顶,所以我们需要提供一些变量来监听子窗口的状态,如果没有打开子窗口就重新打开一个新的子窗口,如果子窗口已经被打开而只是被最小化了,则直接将子窗口与现在已经置顶了的窗口相互交换。所以我设置了变量viewshown和viewclose来监听这个子窗口的状态。当用户打开子窗口的时候,隐藏子窗口的时候,关闭窗口的时候就会改变这两个变量,改变按钮对应的事件。

         第三个遇到的问题就是用户能够通过子窗口中的一个按钮来返回用户的主窗口,这就涉及到一个问题,就是窗口之间的通信,在微软的官方文档中就建议了开发者一定需要设置一个按钮来让用户从子窗口返回子窗口,所以微软官方也提供了一个方法就是在页面跳转的函数中iframe.Navigate(typeof(Myassistant),currentView.Id);,将现在窗口的ID传到子窗口当中,之后在子窗口中重写onnavigatedTo方法就能获得对应传入的父窗口Id,之后再用这个Id跳转回父窗口即可。

        工作项序号:002 子窗口任务日程列表内容的实现

功能说明书:

        采用了什么技术:MVVM的架构模式以及MVVM的StoryBoard动画

        为什么选择MVVM架构模式来实现:因为老师培训的时候讲的你不用MVVM还打算用别的模式吗?! 因为MVVM架构模式提供了一种将view和控制分离的方法和模式,并且也屏蔽了很多细节,让我们直接对view进行绑定即可。这种设计模式是健康的,并且在进行修改功能的过程中无需关注view层的细节,直接修改对应的viewModel即可,通过view和viewModel的绑定就能实时的将修改的内容显示在view层上。还有一个原因就是可以直接参考老师的代码!

        使用MVVM架构模式时遇到的问题和解决方法:

        利用当前的时间信息和从接口中取出的数据的时间进行对比,来决定显示什么数据,利用AddDays方法可以设置对应的时间偏移量,根据这个偏移量的变化来调整对应的时间,再与取出的数据的时间进行对比,之后再次显示不同的数据即可。在基本的MVVM实现流程的过程中并没有特别大的问题,只是在对应完成选中任务的功能上遇到了一些阻碍,在viewModel里面设置一个selectedTask来标志出哪个Task被选中了,通过点击事件将这个selectedTask和被点击的Task绑在一起,之后就可以进行对这个选中Task的信息更新了。另外在这个页面还使用了storyBoard定义了一个关键帧小动画,之后再通过storyBoard的事件函数来控制播放动画时页面的一些行为,比如动画名.beigin,动画名.completed来定义什么时候触发这个动画,再这个动画结束之后又会执行哪些功能。

       工作项序号:003 webview 一周任务报告的生成

       

         背景:

         典型用户:

               越前白龙马

              作为我们的用户,想通过一个平台来总结过去一周自己的任务完成情况。作为我们的工程师,想找点什么破功能增加自己的代码量。

        采用了什么技术:Web前端开发技术以及c#中webview方法的使用

         为什么选择webview方法以及Web前端开发技术:首先我想要生成一个类似于当今流行的H5风格的报告,而我又通过Touch组了解到了Webview可以在UWP中显示对应的HTML内容,并且可以在其中进行Web中可以进行的所有操作,也可以通过一些方法来达到通过C#来控制Page中的JS进而控制整个页面的流转。并且HTML+JS有着现成的丰富的动画库,在这里我选择使用小而轻的动画库Animated.css,UWP的一些动画库我也使用过并且有一些了解,但是能够提供的符合要求的动画实在太少了,并且动画大多复杂,UWP提供的交互手段,方式,能进行交互的控件都过少了,所以最后我觉得进行web前端开发,再用webview能方便的使用UWP来展示特别炫酷的PPT动画效果。是特技,加特技上去!

          使用Web前端开发和c#中webview方法时遇到的问题和解决方法:

          首先遇到的第一个问题就是Web的资源放在哪里,我首先看了Touch的git库,发现它们是直接放在根目录下的,我也这么尝试了,但是却提示我找不到资源,于是我又查阅了对应的内容,发现Touch是将整个项目发布了出去,所以他们可以用引用项目资源的方式来引用HTML,而在本地,我需要找到对应的资源路径,结果发现是

C:\Users\yuyang bai\AppData\Local\Packages\32ac0a3c-a2e1-4fb5-8035-4048e75ba680_y8hqsk53ez1yt\LocalState\Web

这么一个坑爹的文件夹。。。之后发现如果要对页面进行操作的前提是页面必须加载完毕,于是我又把对应的页面加载的操作放在了页面的构造函数里面,这样能成功的对JS进行调用了。

          第二个问题就是关于这个Web前端开发的过程,虽然这个部分和我们课程的联系不大,并且我也不打算详细的介绍,但是

  这个反而是我花了最多时间的部分,因为涉及到选择什么样的动画库,怎么样定义动画帧这些问题。

         第三个问题就是关于如何通过C#向对应的HTML传递参数并且控制HTML页面的行为,我找到了对应的控制函数webView2.InvokeScriptAsync方法,这个方法接受的第一个参数就是对应页面中的JS函数名,第二个参数是一个string类型的集合,对应向JS函数传递的参数。这样我们就能通过调用这个函数来控制JS页面中的行为了。在处理要传递的数据过程中,我发现

如果在C#中要想让计算结果保留成小数类型还有一个小坑,就是需要使用(decimal)类型才能将计算结果规范为对应的带小数点的小数。

           

 

 

 

          

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值