天天看点

Win10UWP开发总结(二)

Win10UWP开发总结(二)

           近段时间将之前写的一部分uwp做了一个整理,放在了一个项目NeUwp里,有兴趣的可以看看。地址如下:https://github.com/oppqw/NeUWP/

        1.Await方式的控件。

          在很多场景中需要用到弹窗、toast、侧栏之类的。win10虽然提供了Popup,但是个人感觉相当不好用,缺点为:

  • 事件分发会出现问题,特别是键盘,要单独处理
  • 窗口大小不能自己适应窗口大小,需要自己监听窗口变化事件来设置大小
  • 有的时候,popup控件用于设置一个值,然后返回给发起页,这个逻辑其实是可以抽象的。

        基于以上原因写了可等待控件,调用方式极其简单,已经被我放到了UIHelper这个类里面。如下面代码就完成了弹窗和toast两个工作,这么做可以看到很明显的好处就是,除了要定义弹窗内部的样式,其它都由该控件给抽象出来了。

var _value = await UIHelper.ShowDilog(new TestDialog1(), false, true, true);//显示弹窗,由用户在弹窗输入选择
    UIHelper.ShowToast( _value as string, ToastIconType.Ok, "title");//显示toast
           

再看弹窗内部实现,传值出来其实很简单,只要IDialogChild接口,然后用这个接口就可以很方便得把值传出去。

TestDialog1
 public sealed partial class TestDialog1 : UserControl,IDialogChild
    {
        public TestDialog1()
        {
            this.InitializeComponent();
        }

//实现IDialogChild接口,会在显示之前,将父控件给注入进来,在这主要用来船值出去给父控件,从而发送给调用方
        public MDilog ParentDialog
        {
            set; get;
        }

       ...
               //用户选择了bbb
        private void OnSetValue(object sender, RoutedEventArgs e)
        {
            ParentDialog.HideWithResult("bbb");
        }
    }
           
是不是很神奇,弹窗和toast解耦了,而且我现在把类控件的方法都放在了UIHelper里,这样可以放在ViewModel层,不必纠结那些东东是应该放在View还是ViewModel,相当于做了一层抽象,也很方便做单元测试。
Win10UWP开发总结(二)
Win10UWP开发总结(二)

2.图片控件

           这个比较简单,其实是为了做圆角,以及图片可以设置宽高比,进行自动等比缩放。 当然啦,对于图片显示处理其实还可以做更多,比如先根据控件大小生成图片裁剪url,以及缓存的对接及列表重用BitmapSource而非只重用Image等,在我这个项目中,因为涉及敏感信息而且牵扯比较多,且那部分代码不是我写的,所以被我去掉了。

3.pivot

          看到pivot的header动画其实很蛋疼,所以还是对这个布局及动画做了修改,从而看上去没那么反人类。可以设置IsDisableAutoDivider属性来控制各个tab的宽度是否采用自动平分父控件宽度。

Win10UWP开发总结(二)

4.ListView

         对于ListView的使用,下拉刷新一直困扰了我很久,之前一直因为手势被控件内部吃掉了导致做不了,虽然后来使用一些旁门左道解决了,强迫症的我还是很不满意,在做云音乐的时候终于在底层DX引擎里找到了相应的好方法。这个例子其实还参和了我的一部分自己写的框架,可以看到对于列表UI的加载我及一些常用操作,我已经做了一层抽象ListPageViewModelBase,对于定制普通业务页面的时候非常方便,其实在具体项目中,我的列表页面View也是做了抽象的,和ListPageViewModelBase配套,这个自己脑补吧(简单的说,对于列表页面或者其他,其实大部分逻辑是相同的,只不过可能每个item的显示、header、footer及一些边边角角不同而已,项目中只要把这些抽象出接口来就好了)。

Win10UWP开发总结(二)

5.GridView

          对于gridview在win10中真的很蛋疼,因为Win10手机和pc公用一套代码,pc中截面可以拖动,如果按照常规的做法把一些item大小定死,或者出现大片空白,视觉不把开发弄死算是真爱了。另外,在拖拉窗口会发出无数个SizeChanged事件,而对这个事件处理不当就会引起性能问题。我这个gridview就比较好地解决了这个问题。

提供了两种方式适配“”

①定死每行个数,item宽高按比例伸缩

②对item设置一个宽度的范围,比如最小200 最大400,通过变化每行item个数适配,但是在拖动的时候item宽度一直会在这个区间内,

Win10UWP开发总结(二)

注:该项目仅供各位查看实现思路,因为框架层次的东东很多被我给去掉了,如果存在bug,可以联系我哈。