天天看點

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。

繼續閱讀