13

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

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

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

但我的意思是,如果我们有另一种方法来实现它。谢谢大家阅读=)

4

4 回答 4

23

有必要 WindowState="Maximized" ResizeMode="NoResize"在您的窗口的 xaml 中编写:

<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>
于 2013-03-28T12:44:11.320 回答
3
    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;
    }
于 2013-01-26T08:01:57.353 回答
3
WindowState="Maximized"
ResizeMode="NoResize"
WindowStyle="None"

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

访问WindowStyle="None" 一些问题

于 2016-01-11T13:18:33.850 回答
1

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

于 2010-07-31T20:23:12.770 回答