我有使用.NET 3.5的ac #Windows Forms应用程序.
我的机器环境如下:
我有一个UserControl派生的自定义控件,其中包含一些其他UserControl.
我在Visual Studio中的Windows窗体设计器中调出主UserControl,然后我开始单击各种嵌入式UserControl并随机更改一些属性,如Text.然后单击" 保存"工具栏按钮.然后,我继续对控件的属性进行更多更改,然后单击" 保存".
在某个时间点之后(这是不可预测的),Visual Studio将显示错误对话框.
WinForms设计器显示一个标题为" Microsoft Visual Studio " 的模式对话框,以及两行消息" 值不能为空.参数名称:上下文 "和一个"确定"按钮.
不幸的是,在通过单击"确定"按钮关闭此对话框后,Visual Studio现在已损坏我的Form的设计器生成的代码.恢复代码的唯一方法是从备份文件.
我发现的唯一解决方法是在" 属性"窗口中为UserControl 将Localizable设置为false.这不是一个长期的解决方法,因为我需要这个UserControl在我们的生产代码中可以本地化.
我的项目相当简单,没有网络服务等.
我尝试使用另一个Visual Studio实例进行调试,以查看是否可以捕获任何异常,但不会生成任何异常.没有任何重要的调试输出.
还有其他人看过这个问题吗?寻找建议.
更多信息...
我能够成功附加Visual Studio的第二个实例,并确定确实抛出了异常.(我必须取消选中"Just My Code"调试选项,并启用符号服务器等).
显然,当我在WinForm Designer中单击" 保存"时,System.ComponentMackl.Design.Serialization.ContextStack.Push(对象上下文)中的System.dll中出现System.ArgumentNullException.因此,context参数为null,这就是问题所在.仍然不知道为什么会发生这种情况.
这是堆栈跟踪:
System.dll!System.ComponentModel.Design.Serialization.ContextStack.Push(object context)+ 0x88 bytes
System.Design.dll!System.ComponentModel.Design.Serialization.ResourceCodeDomSerializer.ApplyCacheEntry(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager},System.ComponentModel.Design.Serialization.ComponentCache.Entry entry)+ 0x10e bytes
System.Design.dll!System.ComponentModel.Design.Serialization.ComponentCodeDomSerializer.Serialize(System.ComponentModel .Design.Serialization.IDesignerSerializationManager manager = …
Visual Studio 在设计时错误地调用了我的 UserControl 的自定义属性。
我已经阅读了许多关于使用[Browsable( false )]和[DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )]属性的帖子,但这对我不起作用。
要重现此问题,请使用 Visual Studio 创建一个新的Windows 窗体应用程序,然后将用户控件添加到您的项目,并将该用户控件拖到您的窗体上。将公共自定义属性添加到您的用户控件,如下所示。
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
[Browsable( false )]
[DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )]
public bool AreYouThere
{
get
{
MessageBox.Show( "Yes I Am Here!" );
return true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当窗体在 Visual Studio 设计器中打开时,如果我强制解决方案清理然后重建,我将看到一个带有文本“Yes I Am Here!”的 MessageBox,表明 Visual Studio 已经调用了我的用户的AreYouThere属性控制。
这不应该发生,因为我已经使用[ Browsable ( false )]和 …
我正在尝试创建一个Label控件,它使用粗体字体自动显示其文本.
我的环境是C#Windows窗体应用程序,使用.NET 3.5,Visual Studio 2010 SP1,Windows 7 Professional,SP1,32位处理器.
我目前的实施如下所示.
我对这个粗体Label控件的唯一要求是它的行为应该与标准的System.Windows.Forms.Label控件(编程方式和WinForm设计器环境中)完全相同,除了它使用粗体字体绘制的事实它的文字.
以下是我对当前实现的一些顾虑:
我打算在大型应用程序的许多地方使用这个粗体标签控件,在运行时产生数百个此控件实例.我不必要地创建新的Font对象吗?是否应该处理这些Font对象?如果是的话,何时?
我想确保在本地化我的应用程序时(将父容器的Localizable属性设置为true),这个粗体标签将与WinForm资源序列化机制一起运行良好.换句话说,如果我将此粗体标签放到Windows窗体上,然后为窗体设置Localizable为true,然后单击保存,Visual Studio会将我的窗体的资源序列化为MyForm.Designer.cs.这将包括我的粗体标签控件的实例.我为我的粗体标签设置Font的实现是否会破坏这种资源序列化机制?
是否有更好/更清洁的实施?还需要考虑其他问题?
[代码关注]
namespace WindowsFormsApplication1
{
using System.ComponentModel;
using System.Drawing;
/// <summary>
/// Represents a standard Windows label with a bolded font.
/// </summary>
public class BoldLabel : System.Windows.Forms.Label
{
[Browsable( false )]
[DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )]
public override Font Font
{
get
{
Font currentFont = base.Font;
if ( currentFont.Bold )
{
// Nothing to do, since the current font is already bold.
//
return …Run Code Online (Sandbox Code Playgroud)