Определение выделенной кнопки в немодальной форме в основном из

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


person Zachary M Judkins    schedule 27.11.2016    source источник
comment
Я предлагаю вам показать часть вашего текущего кода.   -  person Mahendra Gunawardena    schedule 27.11.2016
comment
Кнопка не имеет состояния выбора. RadioButton делает. Вы можете сделать флажок похожим на кнопку, задав для его свойства Appearance значение Button. Обеспечение того, чтобы другие кнопки были сняты, когда такая кнопка нажата, зависит от вас.   -  person Hans Passant    schedule 27.11.2016


Ответы (1)


У вас есть обработчик событий в немодальном диалоговом окне, подключенном к каждой кнопке. Когда кнопка нажата/переключена, этот обработчик событий сработает, тем самым сообщив вам, что кнопка была нажата/переключена.

Затем вы, вероятно, захотите переслать это уведомление в родительское окно. Вы можете сделать это, вызвав обработчик события в своей основной форме, передав идентификатор выбранной в данный момент кнопки как часть аргументов события. Единственная сложная часть здесь заключается в том, что для вызова обработчика событий в основной форме форма с плавающей палитрой должна поддерживать ссылку на основную форму. Вы можете сделать это вручную, но в этом нет необходимости, так как плавающая палитра всегда должна быть принадлежит главному диалоговому окну (чтобы убедиться, что она действительно плавает поверх него в Z). порядок), поэтому вы можете просто получить ссылку на главное диалоговое окно, используя свойство Owner плавающей палитры. Приведите его к типу основной формы и поднимите событие. Обработайте событие по желанию в функции обработчика событий, определенной для основного класса формы.

Если вам не нужно получать уведомление в основной форме, вы можете просто отслеживать состояние в форме плавающей палитры и считывать его из основной формы, когда вам нужно знать, что это такое. Это потребует, чтобы основная форма сохраняла ссылку на плавающую палитру. Самый простой способ сделать это — иметь переменную-член для основного класса формы, которая содержит экземпляр формы с плавающей палитрой. Это лучший дизайн в любом случае, и он облегчит вам доступ/установку данных в плавающей палитре из главной формы. Это немного увеличивает связанность, что некоторые назвали бы запахом объектно-ориентированного дизайна, но эти два объекта на самом деле очень тесно связаны, так что это не проблема.

Вы заметите, что в нескольких местах выше я называю вашу «немодальную форму» «плавающей палитрой». Это потому, что дизайн, который вы описываете, на самом деле является довольно распространенным сценарием в сложных приложениях, таких как Photoshop, которые имеют плавающие окна палитры, из которых вы можете выбрать инструмент. Paint.NET (написанный на C#) тоже делает именно это и, возможно, реализует его во многом так, как я описал.

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

person Cody Gray    schedule 27.11.2016