2012-01-30 5 views
0

У меня есть собственное окно GTK. Я пытаюсь подключиться к DeleteEvent, используя MonoDevelop или «вручную», просто добавив обработчик события в событие DeleteEvent.GTK Window DeleteEvent не работает

Однако событие не срабатывает, когда я нажимаю кнопку «X» в правом верхнем углу окна (кнопка закрытия, если хотите).

Почему? Для меня это не имеет смысла.

ответ

2

Оказывается, я удалял экземпляр окна до того, как события успели стрелять.

Если бы я должен был описать GTK одним словом, это было бы «неоднозначным».

Лично я ожидал бы, что исключение будет выбрано, когда событие должно быть запущено против объекта. Аналогично, я ожидаю, что окно будет скрыто (или уничтожено), когда оно будет удалено. Ни то, ни другое.

Уроки, извлеченные.

+1

Имейте в виду, что GTK # является оболочкой .NET вокруг GTK + и что GTK + сохраняет свой объект с подсчитанными ссылками. Поэтому, когда вы удаляете управляемый объект, счетчик ссылок просто отбрасывается (и сигналы отключены!), Но само окно не уничтожается до тех пор, пока эта ссылка не достигнет 0. Он не достигнет 0, потому что он реализуется на экране, а оконный менеджер имеет одну ссылку. Это похоже на файл: файл в файловой системе не исчезает, просто удалив объект 'System.IO.File'; вам нужно вызвать 'Delete'. Точно так же окно будет вокруг, пока вы не назовете 'destroy'. – rodrigo

+1

Конечно, но, как вы уже сказали, это оболочка .NET вокруг GTK +. Я хочу, чтобы стандартная обработка ошибок .NET включалась в эту оболочку. В противном случае я мог бы просто написать свою собственную оболочку. И как получилось, что окно не уничтожает себя, когда вызывается? В каком случае вы хотите, чтобы окно было видимым при удалении? –

+0

@ChristopherHarris, Dispose - это не то же самое, что Destroy. Это похоже на дескриптор файла, здесь у вас есть дескриптор окна. – IanNorton

Смежные вопросы