如何在运行时正确禁用WPF窗口的最大化按钮?

时间:2014-06-27 22:28:26

标签: c# wpf pinvoke

我试图在运行时禁用WPF窗口的最大化按钮:当我点击"禁用"按钮最大化按钮应禁用。

为此,我使用以下代码:

private const int GWL_STYLE = -16;
private const int WS_MAXIMIZEBOX = 0x10000;

[DllImport( "user32.dll" )]
private static extern int GetWindowLong( IntPtr hWnd, int nIndex );
[DllImport( "user32.dll" )]
private static extern int SetWindowLong( IntPtr hWnd, int nIndex, int dwNewLong );

public static void DisableMaximizeOf( Window window )
{
   IntPtr winHandle = new WindowInteropHelper( window ).Handle;

   // Get the current style and remove the WS_MAXIMIZEBOX bits
   int style = GetWindowLong( winHandle, GWL_STYLE );
   SetWindowLong( winHandle, GWL_STYLE, style & ~WS_MAXIMIZEBOX );
}

在调用DisableMaximizeOf(...)之后,最大化功能被正确禁用 - 唯一的问题是最大化按钮仍然像以前一样:
EnabledMaximizeButton

如果我将此窗口最小化并再次恢复,则会正确显示该按钮:
DisabledMaximizeButton

所以我尝试刷新GUI,但似乎没有任何效果。 这有解决方案吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这是直接从PInvoke.net

获取的
  

某些窗口数据被缓存,因此在调用SetWindowPos函数之前,使用SetWindowLong所做的更改不会生效。具体来说,如果更改任何框架样式,则必须使用SWP_FRAMECHANGED标志调用SetWindowPos,以便正确更新缓存。

SetWindowPos

答案 1 :(得分:0)

1)转到MainWindow.xaml页面,您可以在其中查看和设计表单。

2)打开XAML窗口并粘贴下面的代码,但替换" your_namespace"使用您的程序命名空间(参见附图)

     xmlns:local="clr-namespace:your_namespace" ResizeMode="CanMinimize"

Example 由于它的简单性,这可能是一个更好的选择。