来自Label的Windows窗体设计器自定义控件具有错误的属性值 - >设计师例外

时间:2011-02-08 11:52:50

标签: .net c++ visual-studio-2010 custom-controls windows-forms-designer

我实际上有点困惑,我已经使用基于Label的自定义控件构建了一个dll,并将AutoSize固定为true。我很高兴地使用它,但设计师使用AutoSize创建的控件仍然设置为true。

我更改了dll,试图让设计师在AutoSize设置为false的情况下显示我的控件,最后在设计器中抛出异常。

我解除了最后一次更改,但仍然有例外!

直到我从头开始创建一个新项目,删除了对dll的所有引用,我才能继续前进。

我真的不知道那里发生了什么。

以下是我的想法:

dll是在它自己的项目(也是解决方案)中创建的,我已将其添加到工具箱中,并在设计器中用于不同的项目中。

它包含基于System::Windows::Forms::Label的自定义控件,AutoSize始终为false。 (我知道这很简单,但是当我知道自己在做什么时,我打算扩展它!)

表单上添加的标签没有AutoSize设置为false,这就是我想要的。我只是希望设计器视图能够反映运行时行为。

当我添加属性[DesignerSerializationVisibility(DesignerSerializationVisibility::Content)]时 我在设计器中抛出异常

[我不确定这是否真的是问题,因为撤消它并没有把我排除在外]

输出

at VSLangProj.Reference.get_Path()
at Microsoft.VisualStudio.Design.VSTypeResolutionService.AssemblyEntry.get_FileName()
at Microsoft.VisualStudio.Design.VSTypeResolutionService.AssemblyEntry.GetMatchIndex(String typeName)
at Microsoft.VisualStudio.Design.VSTypeResolutionService.SearchNormalEntries(AssemblyName assemblyName, String typeName, Boolean ignoreTypeCase, Assembly& assembly, Boolean fastSearch)
at Microsoft.VisualStudio.Design.VSTypeResolutionService.SearchEntries(AssemblyName assemblyName, String typeName, Boolean ignoreCase, Assembly& assembly, ReferenceType refType)
at Microsoft.VisualStudio.Design.VSTypeResolutionService.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, ReferenceType refType)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.AggregateTypeResolutionService.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.AggregateTypeResolutionService.GetType(String name)
at System.ComponentModel.Design.DesignerHost.System.ComponentModel.Design.IDesignerHost.GetType(String typeName)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.EnsureDocument(IDesignerSerializationManager manager)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
at System.ComponentModel.Design.Serialization.BasicDesignerLoader.BeginLoad(IDesignerLoaderHost host) 

代码

#pragma once

#using <System.DLL>
#using <System.Drawing.DLL>
#using <System.Windows.Forms.DLL>

namespace EasyButtons {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;


public ref class ResizeLabel : public System::Windows::Forms::Label
{
public: ResizeLabel(void) {
        this->AutoSize = false;
    }
public:
    virtual property bool AutoSize
    {
        [DesignerSerializationVisibility(DesignerSerializationVisibility::Content)]
        bool get() override
        {
            return false;
        }

        void set(bool x) override
        {
            this->AutoSize = false;
        }
    }

// ... 

}

1 个答案:

答案 0 :(得分:1)

    void set(bool x) override
    {
        this->AutoSize = false;
    }

这是一个错误,你再次打电话给二传手。只要将控件放在表单上,​​这将使设计器崩溃。修正:

    void set(bool x) override
    {
        __super::AutoSize = false;
    }

您还必须在属性上应用该属性,而不是getter。