Рассмотрим следующий код:Как я могу избавиться от исключения «Out of memory», созданного дизайнером Visual Studio?
Главная шаблон формы модель:
public partial class CustomForm : Form
{
public CustomForm()
{
InitializeComponent();
DoubleBuffered = true;
}
}
Конкретная шаблон формы модели:
public partial class PopupForm : CustomForm
{
public PopupForm()
{
InitializeComponent();
BTN_Maximize.Hide();
}
}
Производные формы:
public partial class SiteAccess : CustomForm
{
public SiteAccess()
{
InitializeComponent();
this.SizeGripStyle = SizeGripStyle.Show;
}
}
(основной вид)
+
public partial class Edition : PopupForm
{
public Edition()
{
InitializeComponent();
}
}
+
public partial class Preferences : PopupForm
{
public Preferences()
{
InitializeComponent();
}
}
+
public partial class About : PopupForm
{
public About()
{
InitializeComponent();
}
}
В моей форме шаблон модели PopupForm, я определил обработчик события Paint для пустой панели, например, так:
private void PNL_TitleBar_Paint(object sender, PaintEventArgs e)
{
Brush gradientBrush = new LinearGradientBrush(new Point(0, 0),
new Point((int)e.ClipRectangle.Right, 0),
Color.Gray,
Color.FromArgb(255, 50, 50, 50));
Pen gradientPen = new Pen(gradientBrush);
e.Graphics.DrawLine(gradientPen,
new Point((int)e.ClipRectangle.Left, (int)e.ClipRectangle.Bottom - 1),
new Point((int)e.ClipRectangle.Right, (int)e.ClipRectangle.Bottom - 1));
gradientPen.Dispose();
gradientBrush.Dispose();
}
Чтобы это было коротко, оно просто рисует линию градиента в нижней части панели.
Проблема возникает из-за того, что всякий раз, когда я пытаюсь вставить новый элемент управления из панели инструментов в одном из производных форм PopupForm (издание, Preferences или О), я получаю сообщение:
Причина, по которой я показал вам обработчик событий Paint выше, потому что я обнаружил, что это был источник проблемы, но я до сих пор не знаю, как это исправить. На самом деле, если я удалю код обработчика события Paint, исключение не будет вообще выброшено.
Кстати, я должен указать несколько вещей:
- Исключения, выбрасываемый из визуальной точки зрения студии конструктора только (после компиляции).
- Сама программа работает отлично (никаких исключений вообще).
- Если я запустил программу, закройте ее и вернитесь в конструктор, при вставке элементов управления в форму не будет выбрано никаких исключений.
Однако, если я перестрою решение (без выполнения программы) и вернусь к конструктору, исключение будет отображаться при вставке элементов управления в форму.
- Я попытался использовать инструкцию 'using' вместо прямого вызова функции Dispose(), но все равно ничего. Кроме того, имейте в виду, что у меня есть действительно похожий код в другом обработчике событий Paint в моей форме SiteAccess, поэтому я действительно сомневаюсь, что этот код является реальной проблемой.
Любой идея об этом странном поведении?
В вашем событии рисования не рисуйте заголовок в режиме ['design mode'] (https://stackoverflow.com/questions/73515/how-to-tell-if-net-code-is- Быть-за-визуально-студийным дизайнером) – dbc
Я предполагаю, что я должен способствовать тому, чтобы ответить? – dbc
Удивительный! Я не знал, что все так просто. Благодаря тонну. –