Я делаю вещь типа ящика с инструментами. Немодальное диалоговое окно должно находиться в верхней части экрана и предоставлять параметры выбора, а основная форма должна выполнять параметры в зависимости от того, какая кнопка была нажата. Как определить, какая кнопка выбрана из немодального диалога в главной форме??
Определение выделенной кнопки в немодальной форме в основном из
Ответы (1)
У вас есть обработчик событий в немодальном диалоговом окне, подключенном к каждой кнопке. Когда кнопка нажата/переключена, этот обработчик событий сработает, тем самым сообщив вам, что кнопка была нажата/переключена.
Затем вы, вероятно, захотите переслать это уведомление в родительское окно. Вы можете сделать это, вызвав обработчик события в своей основной форме, передав идентификатор выбранной в данный момент кнопки как часть аргументов события. Единственная сложная часть здесь заключается в том, что для вызова обработчика событий в основной форме форма с плавающей палитрой должна поддерживать ссылку на основную форму. Вы можете сделать это вручную, но в этом нет необходимости, так как плавающая палитра всегда должна быть принадлежит главному диалоговому окну (чтобы убедиться, что она действительно плавает поверх него в Z). порядок), поэтому вы можете просто получить ссылку на главное диалоговое окно, используя свойство Owner
плавающей палитры. Приведите его к типу основной формы и поднимите событие. Обработайте событие по желанию в функции обработчика событий, определенной для основного класса формы.
Если вам не нужно получать уведомление в основной форме, вы можете просто отслеживать состояние в форме плавающей палитры и считывать его из основной формы, когда вам нужно знать, что это такое. Это потребует, чтобы основная форма сохраняла ссылку на плавающую палитру. Самый простой способ сделать это — иметь переменную-член для основного класса формы, которая содержит экземпляр формы с плавающей палитрой. Это лучший дизайн в любом случае, и он облегчит вам доступ/установку данных в плавающей палитре из главной формы. Это немного увеличивает связанность, что некоторые назвали бы запахом объектно-ориентированного дизайна, но эти два объекта на самом деле очень тесно связаны, так что это не проблема.
Вы заметите, что в нескольких местах выше я называю вашу «немодальную форму» «плавающей палитрой». Это потому, что дизайн, который вы описываете, на самом деле является довольно распространенным сценарием в сложных приложениях, таких как Photoshop, которые имеют плавающие окна палитры, из которых вы можете выбрать инструмент. Paint.NET (написанный на C#) тоже делает именно это и, возможно, реализует его во многом так, как я описал.
Больше всего новых программистов на C# ставит в тупик понимание разницы между классом и экземпляром класса. Класс является абстрактным объектом — он содержит всю необходимую информацию для создания объекта. Экземпляр - это сам фактический объект. Существует только одно определение класса для каждого типа класса, но может быть несколько экземпляров/объектов каждого типа класса. Например, предположим, что у вас есть класс основной формы с именем MainForm
. Он содержит весь код (события, свойства, методы и т. д.) для вашей основной формы. Это класс. Для фактического отображения или взаимодействия с вашей основной формой вам потребуется создать экземпляр этого класса MainForm
. Проблема, с которой сталкиваются начинающие программисты, заключается в попытке доступа к свойствам или вызову функций в самом классе, а не в экземпляре (объекте) класса. Вот почему я осторожно говорю, что вам нужно поддерживать ссылку на плавающую палитру — под этим я подразумеваю ваш конкретный экземпляр класса формы плавающей палитры. Убедитесь, что вы понимаете это различие; обратитесь к вашему любимому тексту по программированию на C# (или любом другом объектно-ориентированном языке) для получения дополнительной информации.