这篇文章是其他文章的续写,参考上文:
更新:
感谢网友Engineer的评论,这一切可以在WPF中实现:
ResizeMode=NoResize将不会显示最大化最小化,只有关闭按钮
ResizeMode=CanMinimize最大化按钮被禁用,但是还是会显示,不能按,最小化,关闭按钮正常显示;
ResizeMode和WindowStyle配合使用时就可以实现你要的效果了。
推荐读者使用上述方法,而不是使用额外的Win32 API调用。
由于WPF没有提供上述要求的直接支持,所以我们只能(WPF可以解决,参考上面更新)用非托管本地API来解决,那么首先就是获取WPF窗体(Window对象)的句柄(Handle),这个可以通过System.Windows.Interop.WindowInteropHelper的Handle属性获取,可以写一个扩展方法如下:
static class WindowExtension
{
public static IntPtr GetHandle(this Window window)
{
var helper = new System.Windows.Interop.WindowInteropHelper(window);
return helper.Handle;
}
}
取得了窗体的句柄之后,接下来就是调用本地API了。
首先是最小化按钮,最大化按钮的禁用。这个在Windows Forms里有直接支持,对应Form.MinimumBox和MaximizeBox属性。但WPF中,只能通过SetWindowLongPtr来改变它的内部属性。
关于GetWindowLongPtr和SetWindowLongPtr的平台调用,可以参考我写的另一篇文章:.NET(C#) 平台调用:不依赖平台的GetWindowLongPtr和SetWindowLongPtr API。
源代码使用了Win32窗体API封装工程,把常用Win32窗体的API函数封装起来。这样的话,利用其中的封装方法然后直接通过设置或者取消WS_MINIMIZEBOX和WS_MAXIMIZEBOX来激活或者禁用最小化和最大化按钮。
其次就是整个系统控制按钮,这个包括图标、最大化、最小化和关闭按钮。这个对应Windows Forms中Form.ControlBox属性。在Win32中则是通过取消WS_SYSMENU标志来实现(同样是用SetWindowLongPtr函数)。
最后关于隐藏左上角的图标,可以参考这篇文章:http://blogs.msdn.com/b/wpfsdk/archive/2007/08/02/a-wpf-window-without-an-window-icon-the-thing-you-click-to-get-the-system-menu.aspx
原理则是设置窗体的扩展样式(SetWindowLongPtr中的GWL_EXSTYLE)为WS_EX_DLGMODALFRAME。然后调用SetWindowPos函数进行刷新。而且整个过程应该在WPF Window的SourceInitialized事件中进行。程序根据上面文章的内容,稍做些修改。
差不多就是这些要点,推荐读者下载并浏览源代码。
演示程序截图:
点击“显示标准对话框”后一个没有图标,没有最大化和最小化按钮可以缩放的标准对话框会显示:
还可以显示另一种更实用对话框(不可以点击最小化按钮):
源代码下载
下载地址注意:此为微软SkyDrive存档,请用浏览器直接下载,用某些下载工具可能无法下载
源代码环境:Microsoft Visual C# 2010 Express