C# WPF - 自定义调整大小

3

我需要创建一个带有WindowStyle.None、 AllowsTransparency = true等自定义窗口。

其中一个要求是定制 ResizeGrip 控件。

我已经通过使用 ResizeMode.CanResizeWithGrip 实现了此功能,并从以下开源项目中获取了一些代码: Fluid Kit

如果您感兴趣,请查看 "GlassWindow" 类。

为了完成这项工作,我正在调用以下代码来处理 ResizeGrip 的 MouseLeftButtonDown 事件:

NativeMethods.SendMessage(_interopHelper.Handle, WM.SYSCOMMAND, (IntPtr)((int)SC.SIZE + (int)sizingAction), IntPtr.Zero);

SizingAction 的定义如下:

    enum SizingAction
    {
        West = 1,
        East = 2,
        North = 3,
        NorthWest = 4,
        NorthEast = 5,
        South = 6,
        SouthWest = 7,
        SouthEast = 8,
    }

一切都运行正常,但是我注意到当你通过左下(或任何左侧或顶部)调整大小时会出现一些奇怪的情况。您可以看到WPF窗口在大小和位置更改时重新绘制(从顶部或左侧调整大小时始终发生)。如果您尝试在具有默认窗口样式和调整大小模式的任何窗口上执行此操作,则可以正常工作。除了XP之外,您必须使用经典主题。是否有人知道使用此功能的替代方法?或修复它的方法?我还在MSDN论坛上发布了一些信息,在这里:MSDN论坛。PS-如果有人想要svn检出Fluid Kit并通过在其示例项目中设置StartupUri =“GlassWindow / Window1.xaml”来运行GlassWindow示例,就可以亲眼看到这种行为。编辑:微软告诉我发送产品建议...如果有人遇到类似问题,请单击此处查看链接:产品建议。如果您想亲自尝试,请在此处放置一个示例:示例

Jonathan,我有一个奇怪的问题,即使我调整标准Win32窗口大小;)... - Anvaka
Anvaka必须在XP上运行,将您的主题更改为经典模式以查看我的意思。在Vista及更高版本中,所有窗口都可以正常工作,因为它们具有更先进的渲染功能。我可以接受我的自定义窗口在XP上闪烁,但我的自定义窗口在Vista及更高版本上不得闪烁。 - jonathanpeppers
1个回答

8

微软报告称,所有WPF窗口都会出现这种情况。

标准样式可以工作,因为窗口会呈现标题栏、窗口边框等。当调整标准边框窗口的大小时,在任何计算机上都可以看到WPF客户端区域闪烁。

如果将WindowStyle设置为None,则WPF将渲染整个窗口,因此整个窗口的闪烁变得更加明显。

目前的解决方法是使您的窗口具有固定的大小并调整客户端区域的大小。然而,这会影响性能--所以您最好接受闪烁。

您可以访问我的链接以查看微软是否会修复此问题。如果您遇到类似的问题,请投票支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接