【问题标题】:How to? WPF Window - Maximized, No Resize/Move如何? WPF 窗口 - 最大化,不调整大小/移动
【发布时间】:2011-03-20 02:29:31
【问题描述】:

我正在尝试制作一个已最大化打开的 WPF 窗口,没有调整大小/移动(在系统菜单中,也不是在边框中)。它应该一直最大化,除非用户最小化它。

我试图把WindowState="Maximized"和ResizeMode="CanMinimize",但是当窗口打开时,它覆盖了任务栏(我不想要它)。

我有一个取消 SC_MOVE 和 SC_SIZE 的 WndProc 挂钩。 我还可以使用 WndProc 中的条件进行此控制,例如“如果命令恢复并最小化,恢复,否则,阻止”等等。

但我的意思是,如果我们有其他方法可以做到这一点。 感谢大家阅读=)

【问题讨论】:

  • 这是在所有 Windows 应用程序框架中发现的常见问题。应用程序框架很棒,它们使我们能够非常快速地编写应用程序。问题是它们不能涵盖所有可能的场景,因为它们的目的是隐藏底层系统的细节,当我们发现我们需要有非标准行为时,我们必须深入研究并编写“丑陋”的代码。
  • 您想要一个只能最大化或最小化且没有可以调整大小/移动的正常状态的窗口?但还不是全屏?
  • @John Gardner,这正是我想要的。

标签: wpf window window-resize maximize-window


【解决方案1】:

必须在窗口的xaml中写WindowState="Maximized" ResizeMode="NoResize"

<Window x:Class="Miscellaneous.EditForm"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Edit Form" WindowState="Maximized" ResizeMode="NoResize"></Window>

【讨论】:

  • 设置 WindowState="Maximized" 与 SplashScreen 功能不兼容(您的主窗口将隐藏启动屏幕)。如果你不启动最大化,那么 ResizeMode="NoResize" 将阻止窗口被最大化。
【解决方案2】:
    public Window1()
    {
         InitializeComponent();

          this.SourceInitialized += Window1_SourceInitialized;
    }

    private void Window1_SourceInitialized(object sender, EventArgs e)
    {
        WindowInteropHelper helper = new WindowInteropHelper(this);
        HwndSource source = HwndSource.FromHwnd(helper.Handle);
        source.AddHook(WndProc);
    }

    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MOVE = 0xF010;

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {

        switch (msg)
        {
            case WM_SYSCOMMAND:
                int command = wParam.ToInt32() & 0xfff0;
                if (command == SC_MOVE)
                {
                    handled = true;
                }
                break;
            default:
                break;
        }
        return IntPtr.Zero;
    }

【讨论】:

  • 这段代码只会阻止窗口被移动或最大化。相反,如果您使用 SC_SIZE 它允许最大化和最小化窗口,但不能调整大小。常量 int SC_SIZE = 0xF000;在我的窗口 xaml 中,我使用 WindowState="Minimized" 和 ResizeMode="CanResize"
【解决方案3】:
WindowState="Maximized"
ResizeMode="NoResize"
WindowStyle="None"

WindowStyle="None" 做你想做的事,但是......你失去了窗口标题、关闭按钮和其他问题。

访问WindowStyle="None" some problems

【讨论】:

    【解决方案4】:

    正如 Tergiver 所指出的,这在纯粹的 WPF 方式中是不可能的。您必须使用 P/Invoke。至于为什么窗口打开时会覆盖任务栏,我认为您通过取消 SC_MOVE 和 SC_SIZE 来搞乱一些必需的调用。也许你应该在窗口加载后取消这些调用。

    【讨论】:

    • PInvoke????这个在窗口构造函数中怎么样? // 防止窗口与任务栏重叠 this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight; this.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多