现在所有控件(在每个表单上)都呈现为带有控件名称的框(但在运行时它们都正确地呈现):
注意,标准的.Net表单控件正常工作,因此这只是自定义控件的问题。
如果我从存储库中恢复以前的版本,那么一切都会再次正确呈现。
我可以回退到这个工作版本并继续进行,但如果再次出现问题,我宁愿知道如何解决问题。我在这里发布希望它是一个编程问题而不是Visual Studios 2008问题(顺便说一下,我使用的是SP1)。
更新-问题已跟踪,无法解释
我修复了问题。好吧,修复并不是真正正确的词。我通过逐个删除所有用户控件直到表单再次正确呈现来定位问题。问题出在我的Signature控件上(它已经存在很长时间,只是在我最新的检查中,我将对项目iVirtualDocket.CodeLibrary的引用添加到了主项目中:
iVirtualDocket
- References iVirtualDocket.UIControls
- References iVirtualDocket.CodeLibrary
iVirtualDocket.UIControls
-References iVirtualDocket.CodeLibrary
签名有一个叫做
SignatureData
的属性,它会执行以下操作:public byte[] SignatureData
{
get
{
if (_signature == null)
{
return null;
}
else
{
return iVirtualDocket.CodeLibrary.Conversions.ImageToByteArray(
_signature, ImageFormat.Png);
}
}
}
ImageToByteArray的代码如下:
public static byte[] ImageToByteArray(Image imageToConvert,
ImageFormat formatOfImage)
{
byte[] ret;
using (MemoryStream ms = new MemoryStream())
{
imageToConvert.Save(ms, formatOfImage);
ret = ms.ToArray();
}
return ret;
}
如果我将上述方法移动到
UIControls
项目中,那么一切都可以正常工作。然而,只要我把该方法放回CodeLibrary
项目并在那里调用它,所有的表单都停止呈现用户控件。因此,以下操作可以解决问题,但我真的想知道为什么:
public byte[] SignatureData
{
get
{
if (_signature == null)
{
return null;
}
else
{
// Need to call this code directly here instead of through
// the CodeLibrary conversions, otherwise all user controls stop
// rendering in design mode
byte[] ret;
using (MemoryStream ms = new MemoryStream())
{
_signature.Save(ms, ImageFormat.Png);
ret = ms.ToArray();
}
return ret;
}
}
}
更离奇的是,我甚至还没有使用这个属性。