Итак, чего же мне не хватает в этом WPF?
Вопрос
Предыстория:У меня есть небольшое приложение для воспроизведения видео с пользовательским интерфейсом, вдохновленным почтенным 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, чтобы восполнить эти недостающие события изменения размера?Измерение - это первый проход, который выполняется, когда макету необходимо подстроиться под новый размер, так что это что-то вроде события изменения размера.