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#基础语法知 ...
随机推荐
- Robot Framework 教程 (7) - 使用For循环
在自动化测试过程中,使用For循环来对某个动作进行重复操作是很普遍的行为.在Robot Framework中,各种测试库中均提供了多种方式的For循环结构,在其中覆盖了大部分类型的循环类型.而Robo ...
- Js获取上一月份
new Date(new Date().setMonth(new Date().getMonth() - 1))
- [华商韬略] 拉里·埃里森(Larry Elison) 的传奇人生
拉里·埃里森(Larry Elison) 的传奇人生 开战机.玩游艇.盖皇宫,挑战比尔·盖茨,干掉50多家硅谷豪强……全世界比拉里·埃里森更有钱的只有5个,像他这样的硅谷“坏孩子”却是唯一. 19 ...
- C 语言assert使用
1.assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( i ...
- BZOJ3157/BZOJ3516 国王奇遇记(矩阵快速幂/数学)
由二项式定理,(m+1)k=ΣC(k,i)*mi.由此可以构造矩阵转移,将mi*ik全部塞进去即可,系数即为组合数*m.复杂度O(m3logn),因为大常数喜闻乐见的T掉了. #include< ...
- HDU 6184 Counting Stars
Problem Description Little A is an astronomy lover, and he has found that the sky was so beautiful!S ...
- 3.11 - 3.12 A day with Google
补了一番游记. 找了一个本科学弟一起去上海游玩.本来老板还要我周一过去讨论寒假阅读的论文,总算是把讨论时间挪到周六了. 兴冲冲地买好车票后就开始期待上海Google office的神秘之旅. upda ...
- JUnit中按照顺序执行测试方式
很多情况下,写了一堆的test case,希望某一些test case必须在某个test case之后执行.比如,测试某一个Dao代码,希望添加的case在最前面,然后是修改或者查询,最后才是删除,以 ...
- 开源nginx_lua_waf部署安装
0x01 前言 ngx_lua_waf实现 WAF一句话描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来.所以本文中 ...
- LINUX内核分析第七周——可执行程序的装载
一.得到一个可执行程序 1. 预处理.编译.链接 gcc hello.c -o hello.exe gcc编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤. 预处理 => ...