You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WPF自定义窗口设ResizeMode为CanMinimize仍无法禁用最大化

问题成因

  • 核心原因是自定义WindowChrome配置覆盖了WPF原生属性同步逻辑:当你手动实例化WindowChrome且开启UseAeroCaptionButtons = true时,ResizeMode的设置不会自动同步到系统标题栏按钮,也不会拦截最大化相关的系统行为。
  • 已注册的SystemCommands.MaximizeWindowCommand、SystemCommands.RestoreWindowCommand命令绑定未做可用性限制:如果对应CanExecute回调没有返回false,即使设置了ResizeMode=CanMinimize,最大化相关命令依然可以被触发。
  • 自定义WindowChrome场景下,WPF不会主动清除原生窗口样式的WS_MAXIMIZEBOX标记,双击标题栏、拖动窗口到屏幕顶部等系统级触发最大化的逻辑依然生效。

解决方案

步骤1:拦截命令层面的最大化触发

修改最大化、还原命令的CanExecute回调,直接禁用两类命令的执行:

private void MaximizeWindow_CanExec(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = false;
    e.Handled = true;
}

private void RestoreWindow_CanExec(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = false;
    e.Handled = true;
}

步骤2:彻底禁用系统级最大化逻辑

通过Win32 API直接修改窗口样式,清除最大化功能的底层标记:
首先在窗口类中引入所需依赖和API声明:

using System.Runtime.InteropServices;
using System.Windows.Interop;

public partial class MaterialWindow : Window
{
    [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);
    private const int GWL_STYLE = -16;
    private const int WS_MAXIMIZEBOX = 0x10000;

    // 其他原有代码
}

在构造函数中注册SourceInitialized事件,窗口初始化完成后修改样式:

public MaterialWindow()
{
    // 保留你原有构造函数的全部逻辑
    SourceInitialized += MaterialWindow_SourceInitialized;
}

private void MaterialWindow_SourceInitialized(object sender, EventArgs e)
{
    IntPtr windowHandle = new WindowInteropHelper(this).Handle;
    int currentWindowStyle = GetWindowLong(windowHandle, GWL_STYLE);
    // 清除最大化按钮对应的样式位
    SetWindowLong(windowHandle, GWL_STYLE, currentWindowStyle & ~WS_MAXIMIZEBOX);
}

可选配置

如果你不需要使用系统原生绘制的标题栏按钮,可将WindowChrome配置中的UseAeroCaptionButtons改为false,自行绘制标题栏按钮,可更灵活地控制按钮的外观和可用状态。

预期实现效果:
禁用最大化预期效果

内容的提问来源于stack exchange,提问作者Eric Wood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:36:02