前幾天遇到了一個讓我啼笑皆非的bug,我寫的Wpf程序在Win7裏能夠運行,到XP、WindowsServer裏運行點擊某個控件以後閃退,不報任何錯,在後臺代碼裏trycatch也捕捉不到任何異常。很明顯,這不是後臺的代碼出的錯。當時狀況很艱苦,用戶在十萬八千里以外,他的電腦上也沒有調試環境,我只能在本地一步一步排除錯誤可能,修改、打包、發佈到用戶、卸載、重裝、足足折騰了一天,最後總算是搞定了。服務器
不知道大牛們遇到這樣的狀況怎麼處理。沒有調試環境,本地運行良好,用戶運行就閃退,沒有任何錯誤拋出。你們先思考一番,你遇到這樣的狀況,你會如何處理。架構
我比較笨,第一步,把這個控件關聯的後臺代碼註釋,排除後臺代碼的出錯可能。debug
第二步,既然不是後臺代碼的問題,那就是這個控件的問題了,這是個CheckBox,引用到一個寫好的資源Style,因爲不能到用戶那裏調試,本地也無缺運行,那我就在窗體的Loaded裏找這個資源,代碼賦給這個控件。果真,本地報了一個「{DependencyProperty.UnsetValue}」不是屬性「BorderBrush」的有效值的錯誤,心中竊喜,一看BorderBrush後面賦值的資源,在那個資源文件裏找不到,放在了App.xaml裏,那也行,那就把它弄過來,放到Style同文件裏,本地運行,Ok,發佈給用戶,繼續閃退。調試
第三步,如今十有八九是這個Style的問題了,是什麼問題呢?每次我只要一點擊這個CheckBox就閃退,那我就到Style裏看看,點擊時會有一個向右下平移的TranslateTransform執行了,難道是它?無論,刪了再說,發佈,繼續閃退。再看,Checked爲True和False的時候操做了一個Path,難道是這裏有問題?繼續刪,繼續閃退。orm
到這我就有點抓狂了,好吧,既然這個Style有問題,不用你能夠吧,把引用Style的語句移掉,OK了。資源
雖然是正常運行了,可是問題的根本沒有解決,因爲使用默認的風格影響了用戶的使用,必須使用自定義Style。那好吧,不用那個有問題的Style,用Win7的,直接複製副本到資源文件裏,仍是閃退。io
我開始懷疑是否是系統有問題,用360修復了,問題依舊。form
Google,百度,好像沒有人有我這樣的遭遇,我開始同情本身了。class
驀然回首,發如今不遠處有臺閒置的電腦,是部門的服務器,通常沒人用,這讓我看到了但願,遠程到這臺電腦,它是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裏寫任何資源,新手能夠那樣作,老手千萬不要貽笑大方啊。