Пользовательский элемент управления вызывает Visual Studio 2008 к CRASH - PullRequest
5 голосов
/ 01 октября 2010

Следующий код является пользовательским элементом управления.При использовании этого элемента управления в конструкторе Visual Studio происходит сбой Visual Studio без каких-либо заметных подробностей.

Я использую Visual Studio 2008.

Я что-то здесь не так делаю?

using System;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace InstalacionesSayma.GUI
{
    public class CustomControlTest : Panel
    {
        private Label _label;

        public CustomControlTest()
        {
            _label = new Label();
            this.Controls.Add(_label);
        }

        public override Font Font
        {
            get
            {
                return _label.Font;
            }
            set
            {
                _label.Font = value;
            }
        }
    }
}

Ответы [ 3 ]

5 голосов
/ 01 октября 2010

Сбой происходит из-за того, что у вас есть в поведении шрифта.Вы переопределяете ожидаемое поведение свойства Font панели.Если изменить код шрифта на приведенный ниже, сбой исчезнет:

 public override Font Font
  {
     get
     {
        return base.Font;
     }
     set
     {
        base.Font = value;
        _label.Font = value;
     }
  }
2 голосов
/ 01 октября 2010

Я думаю, что проблема в вашем свойстве Font в свете характера того, как дизайнер работает с панелями и их содержимым.По умолчанию шрифт метки наследуется от шрифта его контейнера (это можно проверить, добавив панель к элементу управления, а затем добавив метку к этой панели. Затем измените шрифт панели и альт, метку -- если вы явно не указали ему шрифт не по умолчанию - будет обновляться с новым контейнерным шрифтом).

Таким образом, при добавлении элемента управления в форму, шрифт меткиобновляется в соответствии со шрифтом контейнера, и запускается бесконечный цикл.

Похоже, вы можете исправить это, указав метке явный шрифт при его создании.Нечто подобное решает проблему:

   public CustomControlTest() 
    { 
        _label = new Label(); 
        _label.Font = new Font("Ariel", 8.5f);
        this.Controls.Add(_label); 
    } 

ETA: В ответ на Ганса я смог воспроизвести сбой, используя предоставленный код и VS2008, и мне удалось избежать сбоя, инициализировавШрифт.

ETA2: В моем предыдущем ETA я понял, что мой ответ мог звучать более резко, чем я предполагал.Возможно, мне следовало упомянуть, что я не видел сбой, пока не попытался добавить элемент управления в форму.Ханс прав, что сам по себе этот код не должен вызывать сбой Visual Studio ... это когда дизайнер вмешивается, чтобы попытаться инициализировать и отрисовать элемент управления, с которым он сталкивается с проблемами.На этой заметке, как можно добавлять комментарии непосредственно к посту другого человека?Нужна ли определенная минимальная репутация?

2 голосов
/ 01 октября 2010

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

Будьте осторожны с конструктором и обработчиками событий, они также запустят время проектирования. Если вы делаете что-либо, что критически зависит от состояния программы, например, пытаетесь открыть файлы или общаться с сервером dbase и так далее, тогда избегайте запуска такого кода, проверяя свойство this.DesignMode.

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