C# WPF - 自定义调整大小

标签 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);

SizingAction 定义为:

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

一切正常,但当您通过西南(或任何左侧或顶部)调整大小时,我注意到有些奇怪。您可以看到 WPF 窗口因大小和位置更改而重绘(从顶部或左侧调整大小时总是会发生这种情况)。

如果您在任何具有默认窗口样式和调整大小模式的窗口上尝试此操作,它工作得很好。除 XP 外,您必须打开经典主题。

有人知道使用它的替代方法吗?或者修复的方法?

我还在 MSDN 论坛上发布了一些信息,此处:MSDN Forums

PS - 如果有人想通过在他们的示例项目中设置 StartupUri="GlassWindow/Window1.xaml"来 svn checkout Fluid Kit 并运行 GlassWindow 示例,您可以亲眼看到这种行为。

编辑:Microsoft 让我发送产品建议...

如果有人有类似问题,链接在这里:

Product Suggestions

如果你想亲 body 验,我也在这里举了一个例子:

Sample

最佳答案

Microsoft 报告说所有 WPF 窗口都会发生这种情况。

标准样式之所以有效,是因为窗口会呈现标题栏、窗口边框等。在调整标准边框窗口的大小时,您可以在任何机器上看到 WPF 客户区闪烁。

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

目前,解决方法是将窗口设置为固定大小并调整客户区的大小。然而,这是相当耗费性能的——所以你最好忍受闪烁。

您可以按照我上面的链接访问我的产品建议,看看 Microsoft 是否会修复此问题。如果您有类似的问题,请投票。

关于C# WPF - 自定义调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1910666/

相关文章:

c# - 更新 EFCore 连接的通用方法

c# - ASP.Net 对象数据源 - 数据绑定(bind)

c# - Xamarin - 显示来自 base64 字符串的图像

c# - 如何删除 BasedOn 样式中的触发器?

c++ - 使用 C++ 删除 WMI 实例

c++ - 查询性能计数器状态?

winapi - 对 OututDebugString 的调用是否应该包含在 #ifdef DEBUG 条件 block 中?

c# - 将 C++ int 数组编码到 C#

c# - 从数据库加载更多项目

c# - 根据 ObservableCollection 是否为空禁用 MenuItem