【发布时间】: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 示例,您可以直接看到这种行为。
编辑:微软让我发送产品建议...
如果有人遇到类似问题,链接在这里:
如果您想亲身体验,我还在这里举了一个例子:
【问题讨论】:
-
乔纳森,即使我调整标准 Win32 窗口的大小,我也有这种奇怪 ;)...
-
Anvaka 必须在 XP 上,将您的主题更改为经典以了解我的意思。在 Vista 和更高版本上,所有窗口都可以工作,因为它们具有更高级的渲染功能。我可以接受我的自定义窗口在 XP 上闪烁,但我的自定义窗口不能在 Vista 及更高版本上闪烁。