Win10 UWP系列:關於錯誤 0x80073CF9及一個小bug的解決
最近一直在開發XX的uwp版本,也是邊摸索邊做,最近遇到幾個比較奇怪的問題,記錄於此。
1、項目可用部署到PC,但無法部署到手機,提示以下錯誤:
錯誤 : DEP0001 : 意外錯誤: Install failed. Please contact your software vendor. (Exception from HRESULT: 0x80073CF9
為了方便開發,我將常用的類庫引用好、默認的幾個頁面做好,然後導出成項目模板,新建項目時都從這個模板開始。之前掌中匯率也是用這個模板做的,可以正常部署,但新建的這個項目就都無法部署到手機了,兩臺電腦都不行,奇怪的是部署到PC又是好好的。
既然找不到其他的原因,只能分析Package.appxmanifest文件了,經比較,另一個項目掌中匯率的ProductId與新項目是一樣的,因為是從同一個項目模板建的。手機裏已經安裝了相同ProductId的項目,所以後來的就無法安裝了,但我印象裏覺得應該是如果id沖突應該會提示卸載之前的app,而PC平臺又完全沒提示這個錯誤,真是奇怪。將手機裏的掌中匯率卸載或修改新項目的ProductId這個問題就解決了。
2、詭異的ListView的Padding導致無法保存列表位置的問題。
UWP默認的ListView樣式,在PC的滾動條比較寬,手機上的很細基本就是一條線。因為ListView默認點擊會變色,我不喜歡ListViewItem都有個Padding,就修改了ListViewItem的模板,設置Padding為0。這樣就產生了在PC上使用時,滾動條會遮住一部分項內容的問題。於是又將ListView設置了一個Padding,設置為12,0。這樣既擋不住內容又不會有背景色了,看起來一切正常。
然後在做一個Master/Detail視圖的頁面時,詭異的問題出現了。在UWP開發中,為了自適應PC和手機不同寬度的布局,可以采用Master/Detail視圖來做,左側列表,右側詳情。
我在MainPage裏放了一個SplitView,用來做漢堡菜單,在SplitView的Content裏,放了一個Grid,分為兩列,每列放一個Frame,用來顯示Master和Detail頁面,Master頁面裏是一個ListView,Detail顯示具體內容。目的是這樣:
在寬度大於720時,兩個Frame同時展示;
寬度小於720時,分為兩種情況:
如果Detail頁面為空,則只顯示Master頁面,也就是將第一列寬度設置為*;第二列寬度為0;
如果Detail頁面不為空,則只顯示Detail頁面,將第一列寬度設置為0,第二列寬度為*。
具體實現是用了一個自定義的StateTrigger來進行切換。但詭異的問題是,當點擊Master頁面的列表,隱藏Master顯示Detail後,再返回鍵返回Master,之前的列表位置變化了,跟之前的項相差三四個位置,不一定,但使用起來很別扭,返回後找不到剛才點的是哪項了。
為了解決這個問題,我懷疑是Master頁面裏有Pivot,結果去掉也不行,然後新建了一個幹凈項目,什麽樣式也沒加,只是點擊一個按鈕設置第一列的寬度為0或*,列表位置就正常了。看來是模板或樣式的問題,挨個找吧。經過仔細查找,終於找到原因所在,就是因為給ListView加了一個Padding。把ListView的Padding去掉,就正常了。
說的過程很簡單,但花了我幾乎半天的時間,但經咨詢禮物說開發者鄭大神,他也是設置了ListView的Padding,卻一切正常。所以可能還是沒找到關鍵問題所在。
去掉了ListView的Padding,滾動條又會遮擋內容了,於是只好把ListViewItem的Padding又加上了……轉了好大一個圈又回到了原點……
最近的進度有點慢,博客也沒大有時間寫了,等手頭這個app開發完後會及時總結一下。
3、‘System.DateTime‘/‘System.Decimal‘ is not a valid Windows Runtime parameter type
在開發後臺任務時,如果類中使用了DateTime或decimal等類型,會報以上錯誤。因為後臺任務是一個Windows運行時組件,不支持這些.NET類型,可以把用到這些類設置為internal、protected或者private,或者把DateTime改為DateTimeOffset,decimal改為double。
Win10 UWP系列:關於錯誤 0x80073CF9及一個小bug的解決