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

21:03:2013 Рі.

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

В GTK-Sharp этот процесс проходит немного по-другому, в сравнении с Windows Forms. Если мы создаем новое окно, то у нас отсутствует метода ShowDialog(), который предоставлял описанный функционал. Мы можем сделать окно модальным, но вызывая метод Show() в коде, мы создаем окно, но сразу после этого код продолжает выполняться, не дожидаясь закрытия окна. А с точки зрения логики работы программы жизненно важно, чтобы код продолжил свое выполнение именно после закрытия вызванного Window.

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

Для того, чтобы добиться остановки выполнения кода родительского окна в 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

Облако Тегов