Window ShowDialog() в Mono GTK# или модальное окно, блокирующее выполнение кода при вызове

21:03:2013 –≥.

«аметка, полезна€ всем тем, кто начинает программировать на Mono GTK# .NET. „асто при разработке приложени€ нужно вызвать окно, дл€ воода данных или дл€ других целей и продолжать дальнейшую работу исход€ из тех процессов, которые произошли в результате вызова окна.

¬ GTK-Sharp этот процесс проходит немного по-другому, в сравнении с Windows Forms. ≈сли мы создаем новое окно, то у нас отсутствует метода ShowDialog(), который предоставл€л описанный функционал. ћы можем сделать окно модальным, но вызыва€ метод Show() в коде, мы создаем окно, но сразу после этого код продолжает выполн€тьс€, не дожида€сь закрыти€ окна. ј с точки зрени€ логики работы программы жизненно важно, чтобы код продолжил свое выполнение именно после закрыти€ вызванного Window.

–азница заключаетс€ в том, что окно, вызываемое в GTK#, хоть и будучи модальным не блокирует выполнение кода родительского окна.

ƒл€ того, чтобы добитьс€ остановки выполнени€ кода родительского окна в GTK# после вызова модального окна нужно создавать окно не наследником ќ Ќј, а наследником ƒ»јЋќ√ј

Ќа иллюстрации ниже показано, какой тип нового файла следует выбирать добавл€€ такое окно:

ShowDialog() в Mono GTK#

 

public partial class ¬аше_Ќазвание_ƒиалога :Gtk.Dialog

—оответственно, в коде, где нужно будет вызвать такое диалоговое окно и определить его результат - мы добавл€ем:

YourDlg ar = newYourDlg();
ar.Modal = true
ResponseType response = (ResponseType) ar.Run();

if(response == ResponseType.Cancel)
{
//обрабатываем все что нужно
}

≈сли в диалоге не только кнопку OK и Cancel - можно добавить другие или придумать другой механизм - в зависимости от того, что нужно - задачей было заблокировать работу кода в родительском окне до завершени€ вызрова дочернего.

¬ј∆Ќќ! ≈сть одна интересна€ особенность - в диалоговом окне GTK# существует разбиение на нижний блок - с кнопками диалога, который называетс€ ActionArea и верхний блок, где может находитс€ все остальное. ƒело в том, что использу€ событи€ нажатий на кнопки в ActionArea можно получить ошибки трудные дл€ понимани€. ƒело том, что как только кнопка, наход€ща€с€ на этой панели заканчивает свою обработку весь диалог возвращает результат родителю, у которого стартует выполнение кода, задерживаемое функцией Run()! ¬ это же врем€ вы можете не закрывать ваше диалоговое окно (а, к примеру, запустить фоновый процесс и ждать обработки).

ќчень странно, но удалить этот Action Area просто невозможно. “очнее можно удалить, но блок автоматически по€витс€.  остылем дл€ выхода из ситуации может быть использование кнопок в верхней части, а все содержимое Action Area в GTK# Mono .NET старатьс€ сжимать по объему и делать элементы невидимыми.

 

 

ƒобавить комментарий


«ащитный код
ќбновить

« —обытие закрыти€ приложени€ в Mono GTK# и завершение процесса ”становить цвет текста конкретного элемента (€чейки) в TreeView GTK# Mono .NET »

‘отоальбом

fotic.jpg

ќблако “егов