Дочернее окно WPF - сеанс удаленного рабочего стола

У нас есть приложение WPF с главным окном и 1 дочерним окном, показываемым ShowDialog с ShowInTaskBar, для которого установлено значение false.

Мы сохраняем их позиции при закрытии и устанавливаем Window.Left и Top при повторном открытии.

Проблема в том, что когда вы подключаете рабочий стол к компьютеру с несколькими мониторами, а затем открываете дочернее окно с сохраненной позицией за кадром, нет возможности перенести его на один монитор.

Есть ли что-то, что мы можем изменить в дочернем окне, чтобы окна справились с этой проблемой? В главном окне этой проблемы нет (я думал, это может быть связано с ShowInTaskBar или с тем, что это главное окно).

Есть ли лучший способ сохранить расположение окна?


person jonathanpeppers    schedule 03.01.2011    source источник
comment
Нашел ссылку здесь: wpf.nickthuesen.com/?p=27   -  person jonathanpeppers    schedule 03.01.2011


Ответы (2)


В WPF нет способа по умолчанию для доступа к любому доступному экрану, кроме основного.

WPF имеет SystemParameters.PrimaryScreenHeight и SystemParameters.PrimaryScreenWidth для работы с основным экраном, однако получить информацию об экранах, кроме основного, вам придется использовать Класс System.Windows.Forms.Screen.

Если вы пошли по маршруту класса System.Windows.Forms.Screen, вы можете сохранить соответствующие данные об окне на основе экрана, на котором оно находится. Затем, прочитав значения, вы можете принудительно переключить окно на нужный экран в зависимости от количества экранов, находящихся в массив System.Windows.Forms.Screen.AllScreens. Это дает вам гибкость при размещении, поскольку вы можете использовать весь доступный экран в системе, а не только основной.

РЕДАКТИРОВАТЬ:

Если вас не интересует получение информации на экране модульным способом (информация для каждого экрана по сравнению с совокупностью всех доступных экранов) и вы не хотите использовать класс System.Windows.Forms.Screen, вы можете использовать < свойства href = "http://msdn.microsoft.com/en-us/library/ms603177.aspx" rel = "nofollow"> SystemParameters.VirtualScreen *, которые предоставят совокупность доступных экранов.

person Aaron McIver    schedule 03.01.2011
comment
Я думаю, что SystemParameters.VirtualScreenHeight и VirtualScreenWidth - это то, что мне нужно. Я собираюсь проверить это. Однако хорошо знать, что здесь нет ничего, что могло бы волшебным образом решить эту проблему. - person jonathanpeppers; 03.01.2011
comment
@Jonathan VirtualScreenHeight / VirtualScreenWidth должен быть общим размером всех доступных экранов по сравнению с изолированным представлением каждого экрана через массив; Предостережение при таком подходе заключается в предположении, что оба монитора имеют одинаковое разрешение, и оба говорят, что 16: 9 или 4: 3. - person Aaron McIver; 03.01.2011
comment
Единственный способ, которым кто-то может вызвать проблему, - это разместить окно на дополнительном мониторе, закрыть мое приложение, а затем изменить разрешение на этом мониторе. Для простоты я бы предпочел не ссылаться на WinForms и потерпел бы 0,01% шанс, что кто-то может вызвать эту проблему. Моему времени можно найти лучшее применение. - person jonathanpeppers; 03.01.2011
comment
VirtualScreenHeight / VirtualScreenWidth отлично работает по результатам нашего сегодняшнего тестирования. Я отмечаю вас как ответ, поскольку вы уже объяснили, что Windows / WPF ничего не настраивает автоматически при удаленном подключении к ПК. - person jonathanpeppers; 04.01.2011
comment
@Jonathan Рад слышать, что это сработало; Я также отредактирую свой ответ, включив примечания о VirtualScreenHeight / Width - person Aaron McIver; 04.01.2011

Всегда должна быть возможность вернуть любое окно на экран. Следующие шаги привязывают текущее активное окно к курсору мыши:

  • Нажмите Alt + Пробел, чтобы открыть системное меню.
  • Нажмите M для "Переместить"
  • Нажмите клавишу со стрелкой вправо
  • теперь перемести мышь
person TomBot    schedule 03.01.2011
comment
Как бы вы этого достигли, если для ShowInTaskbar установлено значение false? В меню Alt + Tab или на панели задач нет элемента. Кроме того, как я мог ожидать, что любой гражданский пользователь узнает, как это сделать? - person jonathanpeppers; 04.01.2011
comment
Alt + Space вызывает системное меню для активного окна - ShowInTaskbar не имеет к этому никакого отношения. Но да, это будет полезно только для тех, кто умеет это делать. - person Joe White; 04.01.2011
comment
@Jonathan Как уже сказал Джо, это не имеет ничего общего с ShowInTaskbar. Когда пользователь открывает дочернее окно, оно становится активным окном, даже если оно находится за пределами экрана. Затем вы можете выполнить описанные выше действия, чтобы вернуть его на экран. - person TomBot; 04.01.2011
comment
И вы ожидаете, что средний пользователь сможет выполнить указанные выше действия? - person jonathanpeppers; 04.01.2011
comment
@Jonathan Обычный пользователь, да. Но я полностью согласен, что вы должны решать это программно. Просто вы сказали «нет возможности вывести это на один монитор», и я почувствовал себя обязанным просветить вас :). - person TomBot; 04.01.2011
comment
Невозможно. Ни в коем случае средний пользователь не сможет управлять меню «Перемещение» с помощью Alt + Пробел, затем M, а затем клавиш со стрелками. Особенно если окно за кадром. Я бы сказал, что контекстное меню, вызываемое правой кнопкой мыши, могло бы помочь в этой ситуации, но комбинация ShowDialog и ShowInTaskbar не разрешает контекстное меню для элемента на панели задач. - person jonathanpeppers; 05.01.2011