Вы не можете сохранить содержимое графического интерфейса в коде экспорта PDF. но вы можете точно определить необходимый минимум и не привязываться к какой-либо структуре, которую вы используете.
Как я это делаю, у меня есть класс Status и класс Progress. Они существуют потому, что Status предназначен для обновления сообщения о состоянии, а индикатор выполнения предназначен для работы с индикатором прогресса.
Оба они работают с объектом, который имеет тип класса IStatusDisplay и IPrograssDisplay с уважением.
Мой графический интерфейс определяет объект, реализующий IStatusDisplay (или IProgressDisplay), и регистрируется как текущий дисплей с DLL, имеющей Status и Progress. В DLL с Status и Progress также есть два синглтона, называемые NullStatus и NullProgress, которые можно использовать, когда не требуется обратная связь с пользовательским интерфейсом.
С помощью этой схемы я могу добавить в свой код столько обновлений Status или Progress, сколько захочу, и меня беспокоит только реализация на уровне GUI. Если я хочу тихий процесс, я могу просто использовать нулевые объекты. Также, если я полностью изменю свой GUI Framework, все, что нужно сделать новому GUI, - это создать новый объект, который реализует IStatusDisplay, IProgressDisplay.
Альтернатива - инициировать события, но я нахожу это запутанным и сложным для обработки на уровне графического интерфейса. Особенно, если у вас есть несколько экранов, пользователь может переключаться между ними. Используя интерфейс, вы делаете соединение более четким и более удобным в использовании.
EDIT
Вы можете создать класс подсказки и IPromptDisplay для обработки ситуации, например, для запроса, хотите ли вы перезаписать файлы.
Например
Dim P as New Prompt(MyPromptDisplay,PromptEnum.YesNo)
'MyPromptDisplay is of IPromptDisplay and was registered by the GUI when the application was initialized
If PromptYesNo.Ask("Do you wish to overwrite files")= PromptReply.Yes Then
'Do stuff here
End If