web-dev-qa-db-ja.com

方法? WPFウィンドウ-最大化、サイズ変更/移動なし

サイズ変更/移動なしで(システムメニューでも境界線でも)、すでに最大化されて開くWPFウィンドウを作成しようとしています。ユーザーが最小化する場合を除いて、常に最大化する必要があります。

WindowState = "Maximized"とResizeMode = "CanMinimize"を配置しようとしましたが、ウィンドウが開くと、タスクバーが覆われます(必要ありません)。

SC_MOVEとSC_SIZEをキャンセルするWndProcへのフックがあります。また、「コマンドが復元されて最小化された場合、復元、それ以外の場合、ブロックする」などのWndProcの条件を使用してこの制御を行うこともできます。

しかし、私のポイントは、それを実現する別の方法があるかどうかです。読んでくれてありがとう=)

12
Thieres Tembra

ウィンドウの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>
17
StepUp
    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;
    }
3
Bindya
WindowState="Maximized"
ResizeMode="NoResize"
WindowStyle="None"

WindowStyle = "None"はあなたが望むことをします、しかし...あなたはウィンドウタイトルを失い、ボタンを閉じ、そして他の問題を抱えています。

訪問 WindowStyle = "None"いくつかの問題

2

Tergiverが指摘したように、これは純粋にWPFの方法では不可能です。 P/Invokeを使用する必要があります。ウィンドウが開いたときにタスクバーが覆われる理由については、SC_MOVEとSC_SIZEをキャンセルして、必要な呼び出しを台無しにしていると思います。たぶん、ウィンドウがロードされた後、それらの呼び出しをキャンセルする必要があります。

1
Marko