Итак, чего же мне не хватает в этом WPF?

StackOverflow https://stackoverflow.com/questions/27733

  •  09-06-2019
  •  | 
  •  

Вопрос

Предыстория:У меня есть небольшое приложение для воспроизведения видео с пользовательским интерфейсом, вдохновленным почтенным Sasami2k, только что обновленное для использования VMR9 (т.е.Direct3D9 с DirectShow) и быть менее нестабильным.В настоящее время это приложение на C ++, использующее необработанный Win32, по необходимости:ни один из различных наборов инструментов выеденного яйца не стоит.WPF, в частности, был невозможен из-за ограничений воздушного пространства.

Итак, теперь, когда D3DImage существует, возможно, было бы целесообразно смешивать и сопоставлять D3D / VMR9 / DirectShow и WPF.Учитывая прошлые разочарования по поводу нерастяжимости Win32, это кажется хорошей вещью.

Но знаешь, я падаю перед первым препятствием здесь.

С помощью Win32 я создал (очень легко) окно без полей, размер которого можно изменять пропорционально, оно привязывается к краям экрана и занимает весь экран (включая область панели задач) при максимальном увеличении.Это видеоприложение, так что все это довольно желательные свойства.

Итак, как сделать то же самое с WPF?

В Win32 я использую:WM_GETMINMAXINFO для управления поведением при максимизации WM_NCHITTEST для управления границами изменения размера WM_MOVING для управления краями привязки к экрану WM_SIZING для управления соотношением сторон при изменении размера

Однако, глядя на WPF, кажется, что различные события приходят слишком поздно, если только я не неправильно понимаю документацию?

Например, я не знаю, когда я нахожусь в середине перемещения, поскольку LocationChanged говорит, что оно срабатывает только после перемещения окна (что слишком поздно).Аналогично, похоже, что StateChanged срабатывает только после того, как окно было восстановлено / развернуто (когда мне нужна информация до максимизации, чтобы сообщить системе правильный максимальный размер).

И я, кажется, совершенно упускаю из виду, где система сообщает мне об изменении размера.Аналогично тестированию на попадание.

Итак, я что-то здесь упускаю, или у меня все равно нет выбора, кроме как вернуться к подключению wndproc к этой штуке?Могу ли я делать то, что хочу, не подключая WndProc?

Если мне нужно использовать WndProc, я мог бы с таким же успехом придерживаться своей существующей кодовой базы;Я хочу иметь более простой и чистый код пользовательского интерфейса, и уход от WndProc является основополагающим для этого.

Если мне действительно нужно подключить WndProc, я должен задаться вопросом--почему?В Win32 есть оконные сообщения о размерах, перемещении, poschanging / poschanged poschanged, и все они полезны.Почему бы WPF не повторить тот же набор событий?Это кажется ненужным пробелом в функциональности.

Кроме того, это означает, что WPF привязан к конкретной реализации, зависящей от USER32.Это означает, что MS не может (скажем, в Windows 7 или 8) инвертировать уровень отображения, чтобы сделать WPF "родным", и эмулировать HWND и WndProcs для устаревших приложений - хотя это именно то, что MS должна делать.

Это было полезно?

Решение

И я, кажется, совершенно упускаю из виду, где система сообщает мне об изменении размера.Аналогично тестированию на попадание.

Для изменения размера вам действительно не хватает Измененный размер событие.AFAIK, к сожалению, нет событий OnSizeChanging, OnLocationChanging и OnStateChanging на Окно в .NET


Я видел это, но, насколько я могу судить, оно срабатывает только после изменения размера, тогда как мне нужно, чтобы событие срабатывало во время изменения размера.Если я не неправильно читаю документы, и это на самом деле срабатывает непрерывно?

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


Разве это не события WinForms?

Хм, ты прав.

Другие советы

Хорошо, чтобы ответить на мой собственный вопрос, мне не хватало Adorners (ни разу не возвращались ни в одном из моих поисковых запросов, так что, похоже, они не так широко известны, как, возможно, должны быть).

К сожалению, они кажутся несколько более сложными, чем переопределения WndProc, но я думаю, что должна быть возможность заставить их делать то, что я хочу.

В коде вы можете установить свойству WindowStyle значение "None", а WindowsState - значение "Maximized".

Я не уверен, как будет выглядеть Xaml.

Можете ли вы, возможно, переопределить ArrangeOverride и / или MeasureOverride, чтобы восполнить эти недостающие события изменения размера?Измерение - это первый проход, который выполняется, когда макету необходимо подстроиться под новый размер, так что это что-то вроде события изменения размера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top