小编aha*_*zah的帖子

为什么WinForm Designer显示消息"值不能为空.参数名称:上下文"?

我有使用.NET 3.5的ac #Windows Forms应用程序.

我的机器环境如下:

  • Visual Studio 2010 Premium,SP1
  • Windows 7专业版,SP1
  • 32位处理器

我有一个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 = …

winforms

11
推荐指数
1
解决办法
1万
查看次数

从 VS 设计器隐藏 WinForm UserControl 自定义属性

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 )]和 …

c# winforms

8
推荐指数
1
解决办法
2586
查看次数

如何设计Bold Label控件?

我正在尝试创建一个Label控件,它使用粗体字体自动显示其文本.

我的环境是C#Windows窗体应用程序,使用.NET 3.5,Visual Studio 2010 SP1,Windows 7 Professional,SP1,32位处理器.

我目前的实施如下所示.

我对这个粗体Label控件的唯一要求是它的行为应该与标准的System.Windows.Forms.Label控件(编程方式和WinForm设计器环境中)完全相同,除了它使用粗体字体绘制的事实它的文字.

以下是我对当前实现的一些顾虑:

  1. 我打算在大型应用程序的许多地方使用这个粗体标签控件,在运行时产生数百个此控件实例.我不必要地创建新的Font对象吗?是否应该处理这些Font对象?如果是的话,何时?

  2. 我想确保在本地化我的应用程序时(将父容器的Localizable属性设置为true),这个粗体标签将与WinForm资源序列化机制一起运行良好.换句话说,如果我将此粗体标签放到Windows窗体上,然后为窗体设置Localizable为true,然后单击保存,Visual Studio会将我的窗体的资源序列化为MyForm.Designer.cs.这将包括我的粗体标签控件的实例.我为我的粗体标签设置Font的实现是否会破坏这种资源序列化机制?

  3. 是否有更好/更清洁的实施?还需要考虑其他问题?

[代码关注]

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)

.net c# winforms

4
推荐指数
1
解决办法
6970
查看次数

标签 统计

winforms ×3

c# ×2

.net ×1