`DesignMode` в субконтролях установлен неправильно? - PullRequest
11 голосов
/ 21 декабря 2010

У меня составной элемент управления содержит вложенные элементы управления. Проблема, с которой я сталкиваюсь, заключается в том, что управление свойствами чтения из глобального класса настроек является статическим, а внутреннее чтение - из файла настроек. Чтобы запретить индивидуальному элементу управления доступ к конфигурации в режиме конструктора, я добавил проверку в каждом элементе управления.

If(!DesignMode){
    ...
    //Initialize properties e.g. prop = AppConfig.GetProperty("prop1");
}

Проблема в том, что индивидуальный контроль работает нормально при открытии в VS. Но когда я открываю верхний элемент управления, содержащий вложенный элемент управления, я получаю сообщение об ошибке от дизайнера VS. Ошибка в том, что во вложенном элементе управления DesignMode=false почему-то нет.

Я также создал тестовое приложение и создал простой элемент управления в другом элементе управления, чтобы проверить, есть ли проблема с VS, но, похоже, он работает правильно для любой глубины элементов управления.

Я даже не знаю, как это отладить. А пока я закомментирую код инициализации свойства и соберу его, а затем открою конструктор, а затем раскомментирую его и соберу снова, чтобы запустить.

Кто-нибудь сталкивался с этой проблемой или есть способ ее исправить.

Ответы [ 3 ]

20 голосов
/ 21 декабря 2010

Проблема, с которой вы сталкиваетесь, заключается в том, что в режиме конструктора не установлено в конструкторе (на любом уровне).

Переместите методы инициализации в событие Load, чтобы избежать этой проблемы.

Кроме того, вы можете добавить дополнительное сравнение с:

 protected bool IsInDesignMode
 {
    get
    {
        return DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime;
    }
 }

Это определенно обеспечит точный способ определения режима разработки, поскольку иногда VisualStudio возвращает DesignMode = false при размещении пользовательских элементов управленияв форме или при обновлении формы отобразите ее в дизайне.

0 голосов
/ 20 апреля 2018

я определяю статический bool NotInDesignMode в Program.cs и устанавливаю значение true в Main ()

таким образом я не беру никаких зависимостей от LicenseManager.UsageMode

однако вы не сделаете этого, если будете писать универсальный класс lib.

0 голосов
/ 28 ноября 2016

У меня была такая же проблема.Может быть, это поможет вам.

    protected override void Dispose(bool disposing)
    {
        if (Application.ExecutablePath.IndexOf("devenv.exe", StringComparison.OrdinalIgnoreCase) < 0)
        {
            try
            {
                if (m_NormalImage != null) m_NormalImage.Dispose();
                if (m_DownImage != null) m_DownImage.Dispose();
                if (m_HoverImage != null) m_HoverImage.Dispose();

                m_NormalImage = null;
                m_DownImage = null;
                m_HoverImage = null;
            }
            catch
            {
            }
        }

        base.Dispose(disposing);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...