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里写任何资源,新手可以那样做,老手千万不要贻笑大方啊。
WPF让人哭笑不得的资源的更多相关文章
- WPF让人哭笑不得的资源(二)
再吐槽一下(我已经无力吐槽).今天又被资源搞了一天,发现了一个秘密.大家想听就跟随我... 以前写的一个东东,想用mvvm重新实现一下,由于之前的写得很乱,App.xaml里一坨一坨的,就把资源整到一 ...
- WPF让人哭笑不得的BUG
前几天遇到了一个让我哭笑不得的bug,我写的Wpf程序在Win7里可以运行,到XP.WindowsServer里运行点击某个控件之后闪退,不报任何错,在后台代码里trycatch也捕捉不到任何异常.很 ...
- wpf多程序集之间共享资源字典--CLR名称空间未定义云云
wpf多程序集之间共享资源字典--CLR名称空间未定义云云 分类: WPF 2012-10-28 10:57 1162人阅读 评论(0) 收藏 举报 以下介绍如何创建可用于在多个程序集之间共享的资源字 ...
- WPF 引用DLL纯图像资源包类库中的图片
原文:WPF 引用DLL纯图像资源包类库中的图片 1.建立WPF应用程序 过程略. 2.创建类库项目(图片资源包) 创建图片资源类库项目MyImages,删除 ...
- 国外AI界牛人主页 及资源链接
感觉 好博客要收集,还是贴在自己空间里难忘!!! 原文链接:http://blog.csdn.net/hitwengqi/article/details/7907366 http://people.c ...
- WPF入门(4)——资源
引用<深入浅出WPF>对资源的解读: 每个WPF的界面元素都具有一个名为Resources的属性,这个属性继承自FrameworkElement类,其类型为ResourceDictiona ...
- 使用WPF实现的 喜马拉雅FM 资源下载工具
因为喜马拉雅pc网站上没有提供下载功能,之前有个同事问我有没有办法将资源下载到本地,当然通过浏览器F12也能找到下载地址,但挺麻烦.正好最近想学wpf,周末在家也没事,于是对着百度撸了下代码.当然只能 ...
- WPF整理-跨程序集访问资源
“Sometimes binary resources are defined in one assembly (typically a class library), but areneeded i ...
- wpf 在引用外部的资源字典
启动的APP.xaml
随机推荐
- HDU2102 A计划
解题思路:一道简单题,却WA了十几发,犯几个低级错误.还是不能急躁, 内心要平静,具体分析见代码: #include<iostream> #include<cstdio> ...
- <Liunx常用命令一>之TOP
一:作用 ----->TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况. ----->TOP是一个动态显示过程,即可以通过用 ...
- springmvc 入门级教程
1.先看下目录结构 2.引用所需的jar文件 3.web.xml 配置如下 <?xml version="1.0" encoding="UTF-8"?&g ...
- web开发利器 fiddler
http://mccxj.github.io/blog/20130531_introduce-to-fiddler.html
- [转] 从 dll 程序集中动态加载窗体
无涯 原文 从 dll 程序集中动态加载窗体 [原创] 昨天晚上花了一晚上时间写了一个从程序集中动态加载窗体的程序.将任何包含窗体的代码编译成 dll 文件,再把 dll 文件拷贝到本程序的目录下,本 ...
- free-jqGrid
PM> Install-Package free-jqGrid jqGrid 是一个用来显示网格数据的jQuery插件,通过使用jqGrid可以轻松实现前端页面与后台数据的ajax异步通信.文档 ...
- 【Unity入门】场景、游戏物体和组件的概念
版权声明:本文为博主原创文章,转载请注明出处. 游戏和电影一样,是通过每一个镜头的串联来实现的,而这样的镜头我们称之为“场景”.一个游戏一般包含一个到多个场景,这些场景里面实现了不同的功能,把它们组合 ...
- js数组依据下标删除元素
最近在项目中遇到了一些问题,基础性的东西记得不牢固,就总结一下放在这里备再次查找,对操作js数组的一些问题一些常用的记录! 1.创建数组 var array = new Array(); var ar ...
- Fedora20 和ubuntu 14.04 chrome标签中文乱码
作为两个流行的桌面发行版本,Fedora和ubuntu最新版本都存在chrome标签中文乱码问题. 下面是解决办法,都来自百度贴吧. 1.ubuntu 系列: 解决办法就是: 编辑/etc/fonts ...
- 【Siverlight - 扩展篇】Silverlight在OOB模式下实现默认打开最大化
在App.xaml.cs中输入以下代码:在OOB客户端打开,可以实现窗口默认最大化: private void Application_Startup(object sender, Startup ...