Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2349828
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2009-03-02 21:45:40

发现这个问题源于我在把一个小型项目从VS2003转换到2008上去, 因为类似的项目转换已经做过几次, 最近这一次做的时候自以为留心记取了一些需要注意的地方, 转换完之后编译运行都没问题, 但遗漏了一个问题: 非默认语言的资源文件仍然是VS2003(.NET 1.1)对应的1.3 版本的格式.

在维护者需要修改Form时, 问题出现了, 新添加的菜单项不能保存, 保存后再打开发现刚刚添加的东西不见了, 其实问题不独在添加菜单, 在Form Designer中做任何改变都不能正确保存.

原因是, VS2008 中的Form Designer中, 作为Form一部分的子控件, 必需有一个default的ctor其可见性是public, 稍低一级的访问修饰符如internal就不行, 更典型的出错是选择另一种语言时, Form Designer显示该语言下的外观时, 速度很慢, 最终你得到异常, 不能正确进行下去.

把问题缩小到一个很小的sample项目. 证实是上述子控件的可见性问题引起的, 这也说明一个程序在运行时对它的各种对象的可见性的要求与设计时是不对等的, 也是VS2008的一个bug, 在VS2003中应该没有这个Bug, 因为这个项目是我从VS2003上开发了有一段不短的时间了, 一直没有发现有这方面的问题.

另外发现几点 Form Designer中的特点:
1. 想支持多语言, 必需先支持Localizable = True, 否则选辛辛苦苦从长长的语言菜单中选取到了简体中文, 一点击它呱叽就回到(Default)了.
2. 如果你仅仅是切换到另一种语言, 没改任何属性, 就切换回了(Default), 并不会出现该语言对应的资源文件, 但是, 如果你改变了一个属性, 哪怕只是改变了变量的名字这个非Localizable的属性, 也会产生相应的资源文件, 资源文件一经产生, 就不会经由你在Form Designer的操作自动消失. 除非你手工把它从项目里删除.

我对可见性的偏执被VS2008打败了, 本来在项目里是要求最低可见性原则, 不被其它项目使用的UI元素, 也都弄成Internal的, 不想, Form Designer背后的代码却坚持要求 public.



看看代码里:
下面的this.userControl1 赋值的语句是我手工加上去的, 如果可见性不对, Form Designer会把这行删掉.


下面的那个public至关重要.

文件:WindowsFormsApplication1.rar
大小:13KB
下载:下载

阅读(1860) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~