2009-12-15 103 views
3

我需要做出与WindowStyle.None,AllowsTransparency = TRUE,等自定义窗口C#WPF - 自定义缩放

一个要求是一个自定义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, 
    } 

它所有的工作,但我当您通过SouthWest(或任何左侧或顶部)调整大小时会注意到一些奇怪的现象。您可以看到WPF窗口重新绘制大小和位置更改(从顶部或左侧调整大小时总是会发生这种情况)。

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

有谁知道使用它的替代方案?或者一种方法来解决它?

我也张贴在MSDN论坛上的一些信息,在这里:MSDN Forums

PS - 您可以看到此行为的第一手资料,如果有人想使用svn结帐流体包,并通过设置的StartupUri =“GlassWindow /窗口1运行GlassWindow例子.xaml“在他们的示例项目中。

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

链接在这里如果任何人有类似的问题:

Product Suggestions

我也把一个例子这里如果您希望想尝试一下它的第一手:

Sample

+0

乔纳森,即使我调整标准的Win32窗口,我也有这种奇怪;)... ... – Anvaka 2009-12-16 06:46:27

+0

Anvaka必须在XP上,将你的主题改为经典来看看我的意思。在Vista和更高版本中,所有窗口都能工作,因为它们具有更高级的渲染功能我可以接受我的自定义窗口在XP上闪烁,但我的自定义窗口不得在Vista和更高版本上闪烁。 – jonathanpeppers 2009-12-22 20:12:44

回答

8

微软报告发生这种情况,所有的WPF共赢DOWS。

标准样式的工作原理是因为窗口会渲染标题栏,窗口边框等。调整标准边框窗口的大小时,可以在任何机器上看到WPF客户区闪烁。

如果将WindowStyle设置为None,那么WPF将呈现整个窗口,因此整个窗口闪烁后此闪烁变得更明显。

现在,解决方法是让您的窗口固定大小并调整客户区域的大小。然而,这是非常性能密集型 - 所以你可能会更好地适应闪烁。

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