您的位置:首页 > 其它

[WPF]自由配置窗体最大化、最小化按钮是否可用,窗口大小不可改变

2011-01-24 17:06 691 查看
最近做项目碰到一个需求,要求该窗体禁用最大化按钮,但是保留最小化按钮。窗体大小不可改变。

献贴上效果图



下面是具体做法:

1. 自定义了两个DependencyProperty,具体实现需要用到User32.dll中的函数。代码如下:

public static class WindowHelper
{
private const Int32 GWL_STYLE = -16;
private const Int32 WS_MAXIMIZEBOX = 0x00010000;
private const Int32 WS_MINIMIZEBOX = 0x00020000;

[DllImport("User32.dll", EntryPoint = "GetWindowLong")]
private extern static Int32 GetWindowLongPtr(IntPtr hWnd, Int32 nIndex);

[DllImport("User32.dll", EntryPoint = "SetWindowLong")]
private extern static Int32 SetWindowLongPtr(IntPtr hWnd, Int32 nIndex, Int32 dwNewLong);

/// <summary>
/// Disables the maximize functionality of a WPF window.
/// </summary>
/// <param name="window">The WPF window to be modified.</param>
public static void DisableMaximize(Window window)
{
lock (window)
{
IntPtr hWnd = new WindowInteropHelper(window).Handle;
Int32 windowStyle = GetWindowLongPtr(hWnd, GWL_STYLE);
SetWindowLongPtr(hWnd, GWL_STYLE, windowStyle & ~WS_MAXIMIZEBOX);
}
}

/// <summary>
/// Disables the minimize functionality of a WPF window.
/// </summary>
/// <param name="window">The WPF window to be modified.</param>
public static void DisableMinimize(Window window)
{
lock (window)
{
IntPtr hWnd = new WindowInteropHelper(window).Handle;
Int32 windowStyle = GetWindowLongPtr(hWnd, GWL_STYLE);
SetWindowLongPtr(hWnd, GWL_STYLE, windowStyle & ~WS_MINIMIZEBOX);
}
}

/// <summary>
/// Enables the maximize functionality of a WPF window.
/// </summary>
/// <param name="window">The WPF window to be modified.</param>
public static void EnableMaximize(Window window)
{
lock (window)
{
IntPtr hWnd = new WindowInteropHelper(window).Handle;
Int32 windowStyle = GetWindowLongPtr(hWnd, GWL_STYLE);
SetWindowLongPtr(hWnd, GWL_STYLE, windowStyle | WS_MAXIMIZEBOX);
}
}

/// <summary>
/// Enables the minimize functionality of a WPF window.
/// </summary>
/// <param name="window">The WPF window to be modified.</param>
public static void EnableMinimize(Window window)
{
lock (window)
{
IntPtr hWnd = new WindowInteropHelper(window).Handle;
Int32 windowStyle = GetWindowLongPtr(hWnd, GWL_STYLE);
SetWindowLongPtr(hWnd, GWL_STYLE, windowStyle | WS_MINIMIZEBOX);
}
}

/// <summary>
/// Toggles the enabled state of a WPF window's maximize functionality.
/// </summary>
/// <param name="window">The WPF window to be modified.</param>
public static void ToggleMaximize(Window window)
{
lock (window)
{
IntPtr hWnd = new WindowInteropHelper(window).Handle;
Int32 windowStyle = GetWindowLongPtr(hWnd, GWL_STYLE);

if ((windowStyle | WS_MAXIMIZEBOX) == windowStyle)
{
SetWindowLongPtr(hWnd, GWL_STYLE, windowStyle & ~WS_MAXIMIZEBOX);
}
else
{
SetWindowLongPtr(hWnd, GWL_STYLE, windowStyle | WS_MAXIMIZEBOX);
}
}
}

/// <summary>
/// Toggles the enabled state of a WPF window's minimize functionality.
/// </summary>
/// <param name="window">The WPF window to be modified.</param>
public static void ToggleMinimize(Window window)
{
lock (window)
{
IntPtr hWnd = new WindowInteropHelper(window).Handle;
Int32 windowStyle = GetWindowLongPtr(hWnd, GWL_STYLE);

if ((windowStyle | WS_MINIMIZEBOX) == windowStyle)
{
SetWindowLongPtr(hWnd, GWL_STYLE, windowStyle & ~WS_MINIMIZEBOX);
}
else
{
SetWindowLongPtr(hWnd, GWL_STYLE, windowStyle | WS_MINIMIZEBOX);
}
}
}
}


2. 在窗体中使用这两个Property,就可以自由enable/disable最大化和最小化按钮了。需要注意,ResizeMode需设置为CanResize,否则最大化和最小化按钮都会隐藏。


3. 禁止Resize,实际上只是把窗口的MinSize和MaxSize设置成一样即可。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.MaxHeight = this.Height;
this.MinHeight = this.Height;
this.MaxWidth = this.Width;
this.MinWidth = this.Width;
}


使用如上方法,基本可以满足各种对窗体大小的需求了。FYI ^^

---------------------------------------------------------------------------------------------------------------------

参考:http://thrash505.wordpress.com/2010/04/19/wpf-window-disable-minimize-and-maximize-buttons-through-attached-properties-from-xaml
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐