Ответ 1
Это происходит потому, что повторное подключение RDP уведомляет код WPF о том, что сеансовое приложение изменило сеанс и экран. WPF необходимо перестроить свои ресурсы DirectX и, вероятно, обработать обновленный размер экрана (хотя разрешение может быть одинаковым). Это имеет смысл b/c, клиент RDP может указывать различные возможности, такие как уровень графики и другие свойства на вкладке "Опыт" RDP. WPF не определяет, что параметры все те же, что и в последний раз, когда произошло соединение, и запускает новый цикл рендеринга и компоновки (имеет смысл, поскольку цвета и разрешение экрана могут быть изменены). Это приводит к перезагрузке элементов управления и новому запуску события Loaded.
Вы можете увидеть многое из подробностей этого вопроса, изучив HwndTarget.cs в источнике .NET. Найдите этот файл для "session", и вы увидите LOT обработки для отключения сеанса/повторного подключения.
Если вы хотите найти способ избежать дополнительной работы в вашем загруженном/незагруженном коде, вам может потребоваться переместить его в функцию, которую вы убедитесь, что вы вызываете только один раз с помощью флага или нулевой проверки.
Вы можете увидеть, что происходит, добавив точку останова в обработчик событий Loaded и перейдите в "Инструменты" > "Параметры", "Отладка" и "Отключить только мой код" и установите флажок "Включить стекирование исходного кода .NET" и установите флажок "Включить Source Server". Когда вы подключаете RDP, bkpt будет запускаться, и стек вызовов покажет событие изменения размера среди других уровней вызовов. Вероятно, это связано с тем, что WPF получает WM_DISPLAYCHANGE, а также все ре-макет в случае более или менее разрешающего действия с этим соединением.