C#WPF - 自定义大小调整

jon*_*ers 3 c# wpf winapi resize

我需要使用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);
Run Code Online (Sandbox Code Playgroud)

SizingAction定义为:

    enum SizingAction
    {
        West = 1,
        East = 2,
        North = 3,
        NorthWest = 4,
        NorthEast = 5,
        South = 6,
        SouthWest = 7,
        SouthEast = 8,
    }
Run Code Online (Sandbox Code Playgroud)

这一切都有效,但是当你通过SouthWest(或任何左侧或顶部)调整大小时,我会发现一些奇怪的东西.您可以看到WPF窗口重绘大小和位置更改(从顶部或左侧调整大小时始终会发生这种情况).

如果您在任何具有默认窗口样式和调整大小模式的窗口上尝试此操作,它就可以正常工作.除了XP之外,你必须拥有经典主题.

有没有人知道使用它的替代品?还是一种解决方法?

我还在MSDN论坛上发布了一些信息,这里是:MSDN论坛

PS - 如果有人想通过在示例项目中设置StartupUri ="GlassWindow/Window1.xaml"来检查Fluid Kit并运行GlassWindow示例,则可以直接看到此行为.

编辑:微软告诉我发送产品建议......

如果有人遇到类似的问题,链接就在这里:

产品建议

如果您想亲自尝试,我也在这里举个例子:

样品

jon*_*ers 8

Microsoft报告这种情况发生在所有WPF窗口中.

标准样式起作用,因为窗口将呈现标题栏,窗口边框等.调整标准边框窗口的大小时,您可以在任何计算机上看到WPF客户端区域闪烁.

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

目前,解决方法是使窗口固定大小并调整客户区域的大小.但是,这是相当高性能的 - 所以你可能最好过闪烁.

您可以按照我上面的链接查看我的产品建议,看看微软是否会解决这个问题.如果您遇到类似问题,请投票支持.