天天看點

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,可以聯系我哈。