WPF讓人哭笑不得的資源

前幾天遇到了一個讓我哭笑不得的bug,我寫的Wpf程序在Win7裏可以運行,到XP、WindowsServer裏運行點擊某個控件之後閃退,不報任何錯,在後臺代碼裏trycatch也捕捉不到任何異常。很明顯,這不是後臺的代碼出的錯。當時情況很艱苦,用戶在十萬八千里之外,他的電腦上也沒有調試環境,我只能在本地一步一步排除錯誤可能,修改、打包、發佈到用戶、卸載、重裝、足足折騰了一天,最後總算是搞定了。

  不知道大牛們遇到這樣的情況怎麼處理。沒有調試環境,本地運行良好,用戶運行就閃退,沒有任何錯誤拋出。大家先思考一番,你遇到這樣的情況,你會如何處理。

  我比較笨,第一步,把這個控件關聯的後臺代碼註釋,排除後臺代碼的出錯可能。

  第二步,既然不是後臺代碼的問題,那就是這個控件的問題了,這是個CheckBox,引用到一個寫好的資源Style,由於不能到用戶那裏調試,本地也完好運行,那我就在窗體的Loaded裏找這個資源,代碼賦給這個控件。果然,本地報了一個“{DependencyProperty.UnsetValue}”不是屬性“BorderBrush”的有效值的錯誤,心中竊喜,一看BorderBrush後面賦值的資源,在那個資源文件裏找不到,放在了App.xaml裏,那也行,那就把它弄過來,放到Style同文件裏,本地運行,Ok,發佈給用戶,繼續閃退。

  第三步,現在十有八九是這個Style的問題了,是什麼問題呢?每次我只要一點擊這個CheckBox就閃退,那我就到Style裏看看,點擊時會有一個向右下平移的TranslateTransform執行了,難道是它?不管,刪了再說,發佈,繼續閃退。再看,Checked爲True和False的時候操作了一個Path,難道是這裏有問題?繼續刪,繼續閃退。

  到這我就有點抓狂了,好吧,既然這個Style有問題,不用你可以吧,把引用Style的語句移掉,OK了。

  雖然是正常運行了,但是問題的根本沒有解決,由於使用默認的風格影響了用戶的使用,必須使用自定義Style。那好吧,不用那個有問題的Style,用Win7的,直接複製副本到資源文件裏,還是閃退。

  我開始懷疑是不是系統有問題,用360修復了,問題依舊。

  Google,百度,好像沒有人有我這樣的遭遇,我開始同情自己了。

  驀然回首,發現在不遠處有臺閒置的電腦,是部門的服務器,一般沒人用,這讓我看到了希望,遠程到這臺電腦,它是WindowsServer2003,上面也沒有VS2010,但是畢竟是局域網,直接debug文件夾拷上去運行,一樣閃退。

  難道是混在資源文件裏會出錯?好吧,單獨給你弄個資源文件,繼續閃退。

  沒轍了,這個Style到底哪裏出了問題,不能老這樣閃退啊,好歹給我報個錯,要哭了...已經沒有什麼我能做的了。

  這時候我在想,是不是這個資源要用到App.xaml裏的資源,運行時引用不到?好歹是個機會,於是把App裏的資源全部移到Merged的資源裏,發佈用戶,運行OK,原來正是如此!

  總結:Wpf程序操作控件閃退,一般是由於資源引起的,如Style裏的資源名找不到,寫在分資源文件裏需要引用到App.xaml裏的資源等等,這時候要做的就是整合資源,App裏面的資源全部整合到各自的資源文件裏。如下:

  <Application.Resources>

    <ResourceDictionary>

       <ResourceDictionary.MergedDictionaries>

           <ResourceDictionary Source="SimpleStyles.xaml"/>

            <ResourceDictionary Source="SpecalStyles.xaml"/>

            <ResourceDictionary Source="WindowStyles.xaml"/>

       </ResourceDictionary.MergedDictionaries>

    </ResourceDictionary>

  </Application.Resources>  

  建議:在程序架構剛剛搭建的時候就注意資源的分流,不要全擠在App.xaml裏,App.xaml只作Merged,不是必須不在App.xaml裏寫任何資源,新手可以那樣做,老手千萬不要貽笑大方啊。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章