【问题标题】:C# WPF - custom resizingC# WPF - 自定义调整大小
【发布时间】:2009-12-15 21:53:02
【问题描述】:

我需要使用 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 - 如果有人想要 svn checkout Fluid Kit 并通过在他们的示例项目中设置 StartupUri="GlassWindow/Window1.xaml" 来运行 GlassWindow 示例,您可以直接看到这种行为。

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

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

Product Suggestions

如果您想亲身体验,我还在这里举了一个例子:

Sample

【问题讨论】:

  • 乔纳森,即使我调整标准 Win32 窗口的大小,我也有这种奇怪 ;)...
  • Anvaka 必须在 XP 上,将您的主题更改为经典以了解我的意思。在 Vista 和更高版本上,所有窗口都可以工作,因为它们具有更高级的渲染功能。我可以接受我的自定义窗口在 XP 上闪烁,但我的自定义窗口不能在 Vista 及更高版本上闪烁。

标签: c# wpf winapi resize


【解决方案1】:

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

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

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

目前,解决方法是将窗口设置为固定大小并调整客户区的大小。但是,这会占用大量性能 - 因此您最好忍受闪烁。

您可以按照上面的链接访问我的产品建议,看看微软是否会解决这个问题。如果您有类似的问题,请投票给它。

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2021-06-18
    • 2018-06-11
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多