代码之家  ›  专栏  ›  技术社区  ›  DrPizza

那么我在这里缺少什么呢,WPF?

  •  1
  • DrPizza  · 技术社区  · 16 年前

    背景:我有一个小的视频播放应用程序,它的用户界面受到了尊敬的Sasami2K的启发,刚更新为使用vmr9(即direct3d9和directshow),不那么不稳定。目前,它是一个使用原始Win32的C++应用程序,通过必要性:没有一个工具包是值得的。特别是,由于空域限制,WPF是不可能实现的。

    好吧,既然存在d3dimage,那么混合和匹配d3d/vmr9/directshow和wpf可能是可行的。鉴于过去对win32不可扩展性的失望,这似乎是一件好事。

    但你知道,我在第一个跨栏处摔倒了。

    使用Win32,我创建了一个无边界窗口(非常容易),它可以调整大小、按比例调整大小、捕捉屏幕边缘,并在最大化时占据整个屏幕(包括任务栏区域)。这是一个视频应用程序,所以这些都是非常理想的属性。

    好的,那么,如何对WPF做同样的事情呢?

    在Win32中,我使用: wm_etminmaxinfo控制最大化行为 wm nchittest控制调整边框大小 wm_移动以控制捕捉到屏幕边缘 wm_调整大小以控制调整大小的纵横比

    然而,看看WPF,似乎各种事件来得太晚了,除非我误解了文档?

    例如,我不知道什么时候我在移动,因为locationchanged说它只在窗口移动一次(太晚了)才会触发。 类似地,StateChanged似乎只有在窗口恢复/最大化后才会触发(在最大化之前,当我需要信息时,告诉系统正确的最大化大小)。

    我似乎完全忽略了系统告诉我什么是尺寸调整。同样的命中测试。

    那么,呃,我是不是错过了什么东西,还是我别无选择,只好回去勾引北朝鲜民主主义人民共和国?我能做我想做的事而不挂住北朝鲜民主主义人民共和国吗?

    如果我必须使用wndproc,我最好还是使用我现有的代码库;我希望拥有更简单、更干净的UI代码,并且远离wndproc是实现这一点的基础。

    如果我真的要挂上朝鲜民主主义人民共和国,我想知道-- 为什么? 是吗?win32有大小/大小、移动/移动、poschanging/poschanged窗口消息,它们都很有用。为什么wpf不复制相同的事件集?这似乎是功能上不必要的差距。

    另外,它意味着WPF与特定的依赖于用户32的实现绑定在一起。这意味着微软不能(比如说,在Windows7或8中)反转显示层,使WPF成为“本机的”,并为旧版应用程序模拟Hwnds和WndProc——尽管这正是微软应该做的。

    4 回复  |  直到 16 年前
        1
  •  1
  •   Huppie    16 年前

    我似乎完全忽略了系统告诉我什么是尺寸调整。同样的命中测试。

    对于调整大小,您确实缺少 SizeChanged 事件。 阿法克很遗憾没有OnSizeChanging、OnLocationChanging和OnStateChanging事件 Window 在.NET中


    我看到了那个,但据我所知,它只有在大小改变后才会触发,而我需要在调整大小期间触发事件。除非我看错了文件 实际上是连续开火?

    它不会持续燃烧,但您可能可以使用 ResizeBegin ResizeEnd 并能够做到这一点。


    它们不是Winforms事件吗?

    嗯,你说得对。

        2
  •  3
  •   DrPizza    16 年前

    好吧,为了回答我自己的问题,我错过了装饰品(在我做的任何搜索中都没有回来过,所以看起来它们并不像它们应该被广泛了解的那样)。

    不幸的是,他们似乎比西朝鲜民主主义人民共和国否决更为复杂,但我认为有可能操纵他们去做我想做的事情。

        3
  •  1
  •   elgrego    16 年前

    在代码中,可以将WindowsStyle属性设置为“无”,将WindowsState设置为“最大化”

    我不知道XAML会是什么样子。

        4
  •  0
  •   devios1    16 年前

    您是否可以重写arrangeoverride和/或measureoverride以弥补那些丢失的调整大小事件?度量是第一步,当布局需要调整为新的大小时会发生,因此它有点像大小更改事件。