WPF让人哭笑不得的BUG
前几天遇到了一个让我哭笑不得的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里写任何资源,新手可以那样做,老手千万不要贻笑大方啊。
[转]
WPF让人哭笑不得的BUG的更多相关文章
- WPF让人哭笑不得的资源
前几天遇到了一个让我哭笑不得的bug,我写的Wpf程序在Win7里可以运行,到XP.WindowsServer里运行点击某个控件之后闪退,不报任何错,在后台代码里trycatch也捕捉不到任何异常.很 ...
- WPF让人哭笑不得的资源(二)
再吐槽一下(我已经无力吐槽).今天又被资源搞了一天,发现了一个秘密.大家想听就跟随我... 以前写的一个东东,想用mvvm重新实现一下,由于之前的写得很乱,App.xaml里一坨一坨的,就把资源整到一 ...
- WPF中Polyline拐角的bug
原文:WPF中Polyline拐角的bug Polyline绘制折线在小角度(比如几度)的时候会出现不连续的现象,形成拐角的两条线段中有一段会超出,角度越小越明显. 问题如下图 ...
- 【记录】让人淡疼的BUG之参数传送错误
前言 面试的时候往往容易被面试官问到:“说说你遇到过的比较重大或经典的Bug有哪些,能说一说吗?”我被问时脑海的反应是:“尼玛,这个我从来没有刻意记!一时半会咋想得起来,然后还是没想起来或者是随意给了 ...
- WPF RoutedEvent and HitTest - 简书
原文:WPF RoutedEvent and HitTest - 简书 学习的时候切忌心浮气躁,慢慢的过每一个知识点,不要漏掉任何细节.不然当遇到细节问题的时候,会恼,会闹,会悔不该当初--花一下午调 ...
- 那些让程序员目瞪口呆的Bug
程序员一生与bug奋战,可谓是杀敌无数,见怪不怪了!在某知识社交平台中,一个"有哪些让程序员目瞪口呆的bug"的话题引来了6700多万的阅读,可见程序员们对一个话题的敏感度有多高. ...
- WPF中使用DynamicResource实现换肤
这篇将介绍使用DynamicResource实现动态的界面切换功能.熟悉WPF的园友应该已经猜到了实现方式,简而言之就是动态替换DataTemplate,ControlTemplate,Style等等 ...
- WPF Step By Step 系列 - 开篇 ·
WPF Step By Step 系列 - 开篇 公司最近要去我去整理出一个完整的WPF培训的教程,我刚好将自己学习WPF的过程和经验总结整理成笔记的方式来讲述,这里就不按照书上面的东西来说了,书本上 ...
- WPF入门教程系列(一) 创建你的第一个WPF项目
WPF入门教程系列(一) 创建你的第一个WPF项目 WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知 ...
随机推荐
- ORACLE LOG的管理
CREATE OR REPLACE PACKAGE PLOG IS /** * package name : PLOG *<br/> *<br/> *See : <a h ...
- php SPL标准库iterator和ArrayAccess的学习
最近在补充学习php基础的时候看到了spl的介绍,学习了一下iterator和arrayAccess的使用,iterator主要是对象的迭代,一般可以用在容器里面,或者工厂模式里面,最常见的应用场景就 ...
- Oracle 数据库备份启用压缩以及remap
1. Oracle数据库进行备份恢复 客户测试环境, 有时候需要从现场copy到公司, 压缩虽然能够减少部分空间大小,但是copy到虚拟机里面也时浪费很大量的磁盘,所以能够在备份恢复的过程中执行压缩最 ...
- List<Map> 进行求和
public class Main { public static void main(String[] args) { List<Map> lists = new ArrayList&l ...
- 【Nginx笔记】 fastcgi_param解释
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param QUERY_STRI ...
- 设置快捷键 让word轻松实现无格式粘贴
设置快捷键 让word轻松实现无格式粘贴使用word时,我们经常会遇到需要将网页上的内容复制到word进行编辑的情况,但是通常这样复制进来的内容都是带有格式的,编辑起来非常不便.虽然我们可以利用“记事 ...
- BZOJ5324 JXOI2018守卫(区间dp)
对于每个区间[l,r],显然右端点r是必须放置守卫的.考虑其不能监视到的点,构成一段段区间.一个非常显然但我就是想不到的性质是,对于这样的某个区间[x,y],在(y+1,r)内的点都是不能监视到这个区 ...
- [BZOJ2244][SDOI2011]拦截导弹 CDQ分治
2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec Memory Limit: 512 MB Special Judge Description 某国为了防御敌国的导弹 ...
- tarjan解决路径询问问题
好久没更新了,就更一篇普及组内容好了. 首先我们考虑如何用tarjan离线求出lca,伪代码大致如下: def tarjan(x): 将x标记为已访问 for c in x的孩子: tarjan(c) ...
- 【ARC077F】SS
Description 如果某个串可以由两个一样的串前后连接得到,我们就称之为"偶串".比如说"xyzxyz"和"aaaaaa"是偶串,而& ...