С# this.Invalidate() блокирует родительскую форму для доступа

У меня есть решение VS2010 (пытался имитировать мою основную проблему), которое имеет 2 проекта, и каждый проект имеет по одной форме окна. Mainform находится в проекте_1, который имеет ссылку на проект 2, где определена ChildForm.

У меня есть кнопка на MainForm, событие нажатия кнопки которой создает ChildForm и показывает. Пока отображается ChildForm, я могу вызывать любые команды меню (каждая команда меню реализована для отображения окна сообщения), которые определены в MainForm без каких-либо проблем.

НО, с другой стороны, я сохранил весь код как есть и переопределил метод OnPaint для ChildForm с помощью this.Invalidate(), как показано ниже.

protected override void OnPaint(PaintEventArgs e)
    {
        this.Invalidate();
        base.OnPaint(e);
    }

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

Может ли кто-нибудь пролить свет на то, что пошло не так с переопределением метода OnPaint, который каждый раз выполняет строку this.Invalidate(), и предложить, как я могу решить эту проблему.

С уважением, Кумар


person Kumar    schedule 24.09.2013    source источник


Ответы (1)


Вы вызвали Invalidate(), который вызовет OnPaint, OnPaint вызывает Invalidate() и снова... это цикл вызова Invalidate() и OnPaint -> Ваш пользовательский интерфейс заморожен.

Решение состоит в том, что вы должны более четко указать, чего вы хотите, и цель переопределения OnPaint здесь.

person King King    schedule 24.09.2013
comment
Привет! Большое спасибо за ваш ответ. По сути, я намерен непрерывно вращать/вращать 3D-модель DirectX на панели WinForm. Итак, чтобы добиться этого, мне пришлось переопределить метод OnPaint, в котором я буду изменять параметры 3D DirectX и перерисовывать графический объект, заставляя this.validate(); Он отлично работает, если моя дочерняя форма, в которой я вращаю 3D-модель, является моей основной формой. Я бы не стал вызывать какие-либо функции моей основной формы, непрерывно вращая 3D-модель в дочерней форме. Пожалуйста, дайте мне знать, если потребуется дополнительная информация. С уважением, - person Kumar; 24.09.2013
comment
@ Кумар, мне все еще непонятно. Вы можете вызвать Invalidate() в OnPaint другого объекта и наоборот, но вы не можете вызвать Invalidate() в OnPaint того же объекта. Кстати, рисование 3D-модели должно выполняться какой-нибудь DirectX библиотекой с использованием какого-то специального элемента управления (не Form) или с помощью WPF. - person King King; 24.09.2013
comment
Это отличная информация, и спасибо за это. Не могли бы вы сообщить мне, какие специальные элементы управления можно использовать для отображения 3D-моделей с помощью библиотеки DirectX? Пожалуйста, осветите это, чтобы я исследовал дальше. Спасибо за время. - person Kumar; 25.09.2013
comment
@ Кумар, жаль, что я плохо это знаю, тебе следует поискать. - person King King; 25.09.2013