Пользовательский элемент управления Windows Forms Designer из метки имеет неправильное значение свойства -> исключение конструктора - PullRequest
0 голосов
/ 08 февраля 2011

Я на самом деле немного запутался здесь, я создал dll с пользовательским элементом управления на основе Label с AutoSize, установленным как true.Я с радостью использовал его, но дизайнер создал элемент управления с AutoSize, все еще установленным в true.

Я изменил dll, пытаясь заставить дизайнера показать мой элемент управления с AutoSize, установленным в false, и в результате получил исключение вконструктор.

Я отменил последнее изменение, но все еще получил исключение!

Я не смог продвинуться, пока не создал новый проект с нуля, удалив все ссылки на dll.

Я действительно не знаю, что там произошло.

Вот что я думал, что происходило:

DLL создается в своем собственном проекте (и решении тоже), который я добавилна панель инструментов и используется в конструкторе в другом проекте.

Содержит пользовательский элемент управления на основе System::Windows::Forms::Label с AutoSize всегда ложным.(Я знаю, что это очень просто, но я собираюсь расширить его, когда узнаю, что я делаю!)

Для метки, добавленной в форму, не установлено значение 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 Ответ

1 голос
/ 08 февраля 2011
    void set(bool x) override
    {
        this->AutoSize = false;
    }

Это ошибка, вы снова вызываете сеттер.Это приведет к краху конструктора с переполнением стека, как только вы поместите элемент управления в форму.Исправление:

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

Вы также должны применять атрибут к свойству, а не получателю.

...