Как сказал Ханс Олссон , это потенциально можно решить, проверив режим проектирования и отключив логику-нарушитель.
Эта ошибка также сработает, если возникнет какая-либо проблема с конструктором вашего UserControl
. Если при создании экземпляра UserControl
возникнет исключение, то дизайнер потерпит неудачу. В моем случае ошибка привела к тому, что "[...] либо не объявлено, либо ему никогда не было присвоено" ошибка.
Например, см. Следующий пользовательский элемент управления:
public class MyUserControl : UserControl {
public MyUserControl()
{
InitializeComponent();
throw new Exception(); //Causes a designer error.
}
}
Теперь, наблюдая за дизайнером формы, которая содержит это MyUserControl
, мы увидим нечто похожее на следующее:

Я не могу сказать, похож ли конструктор на предыдущие версии Visual Studio; но что касается Visual Studio 2017, вы можете четко видеть, что произошло.
Конструктор не удался, потому что System.Exception
было брошено. В результате переменная [REDACTED]
считалась необъявленной или никогда не присваивалась, хотя на самом деле автоматически сгенерированный код конструктора был верным. Проблема была с конструктором MyUserControl
.
Теперь, если вам нужно поместить логику, которая зависит от внешних служб / ресурсов, в конструктор элемента управления, вам нужно указать, что это должно происходить только во время выполнения. Кроме того, вы можете предоставить макетные ресурсы для времени разработки.
Для этого вы можете использовать LicenseManager
и проверить его текущий UsageMode
.
Измененный код ниже генерирует исключение только во время выполнения, и у дизайнера больше нет ошибки.
public class MyUserControl : UserControl {
public MyUserControl()
{
InitializeComponent();
if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
{
throw new Exception(); //No longer fails in design-time.
}
}
}