我在设计时遇到了 Visual Studios 2008 中的所有表单和自定义控件的问题。在上次签入之前,所有控件都按预期呈现。当前版本和以前的工作版本之间的唯一主要区别是控件上的属性UIText
从 重命名Content
为Value
。其他更改是添加了一个新表单和 3 个新枚举,但肯定没有明显的更改会影响程序中的所有表单(包括新表单)。
所有控件(在每个窗体上)现在呈现为带有控件名称的框(但是它们都在运行时正确呈现):
我尝试在我的项目中创建一个全新的表单,创建一个只有一个标签的全新自定义控件,但我仍然遇到完全相同的问题:
请注意,标准的 .Net 表单控件可以正常工作,因此这只是自定义控件的问题。
如果我从存储库中恢复我以前的版本,那么一切都会重新开始正确呈现:
我可以恢复到这个工作版本并继续,但我宁愿知道如果问题再次发生如何解决。我在这里发帖希望这是一个与 Visual Studios 2008 问题相对的编程问题(顺便说一下,在 SP1 上)。
更新 - 跟踪问题,无法解释
我解决了这个问题。好吧,固定并不是真正的正确词。我通过一次删除所有用户控件 1 来定位问题,直到表单再次开始正确呈现。问题出在我的签名控件中(它已经存在了很长时间,只有在我最近一次签到时,我才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;
}
}
}
(更奇怪的是我还没有使用这个属性。)