web-dev-qa-db-ja.com

アプリの初期化後に最大化すると、Style = NoneのWPFウィンドウがタスクバーをカバーしません

最大化すると(タスクバーも表示されない)全体の領域を占めるWindows MediaPlayerまたはブラウザーベースのFlashプレーヤーと同じ効果を実現したいと思います。

これは、XAMLでWindowStateMaximizedに設定され、WindowStyleNoneに設定されている場合に正常に機能するため、アプリはその状態で起動されます。問題は、境界線のあるウィンドウでアプリを起動したいのですが、ユーザーが選択したら、上記のように最大化します。 StateChangedハンドラーでMaximized状態を確認し、その場合はWindowStyleNoneに設定します。これには、ウィンドウを最大化する効果がありますが、タスクバーはカバーされません。次のコードは私が望むようにこれを機能させますが、それはハックであり、私はそれをクリーンアップしたいと思います:

if (WindowState == WindowState.Maximized)
{
    m_videoWindow.Maximize();

    WindowStyle = WindowStyle.None;

    //the following makes this work but I would like to clean it up
    Hide();
    Show();
}

[〜#〜] edit [〜#〜]This (2006年からまだCTPにいるとき)は問題と誰かに言及していますMSによると、次のバージョンでフルスクリーンのサポートを改善したいと考えていますが、これらの改善は行われていますか?

20
Simon Fox

この記事ではすべてを説明します: タスクバーを考慮してウィンドウを最大化(WindowStyle = None)

また、チェックする価値があります: カスタムウィンドウChrome in WPF

Edit:新しいのは、ウィンドウの完全なスタイル変更を可能にするWPFシェル統合ライブラリですchrome移動の再実装、サイズ変更など。

2015年の編集:シェル統合ライブラリがWPFに統合され、MSがコードを廃止しました

14
Eduardo Molteni

ウィンドウの作成時にプロパティを設定することで(タスクバーをカバーして)フルスクリーンに最大化できることがわかりました(xamlで)が、作成後に前後に切り替えることができませんでした。いくつかの実験の結果、プロパティが設定される順序が重要であることがわかりました。

public bool IsFullscreen
{
    get 
    {
        return WindowState == System.Windows.WindowState.Maximized
            && ResizeMode == System.Windows.ResizeMode.NoResize
            && WindowStyle== System.Windows.WindowStyle.None;
    }
    set
    {
        if ( value )
        {
            ResizeMode = System.Windows.ResizeMode.NoResize;
            WindowStyle = System.Windows.WindowStyle.None;
            WindowState = System.Windows.WindowState.Maximized;
        }
        else
        {
            ResizeMode = System.Windows.ResizeMode.CanResize;
            WindowStyle = System.Windows.WindowStyle.SingleBorderWindow;
            WindowState = System.Windows.WindowState.Normal;            
        }
    }
}

セッターではWindowStateが最後に来るであることに注意してください。

3
Chaz

これをWPF/.NET 4.0アプリケーションで正しく機能させるために、フルスクリーンモードを開始または終了するたびにこの関数を呼び出しています。

private static void RefreshWindowVisibility(Window window)
        {
            if (window.OriginalWindowState == WindowState.Maximized)
            {
                window.Hide();
                window.Show();
                window.BringIntoView();
            }
        }

この方法にはちらつきがありますが、Chromeで全画面モードに移行したときに同じちらつきが存在するようです。 InternetExplorerは別のアプローチを取っているようです。

2
x16forest

これで問題ないかどうかはわかりませんが、ウィンドウのサイズを変更して、作業領域(つまり、ほとんどの場合、タスクバーを除くすべての画面)と同じサイズにし、0,0(左上隅):

Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width; 
Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height; 
Left = 0; 
Top = 0;

(MSDNからの)WorkingAreaプロパティの正確な定義は次のとおりです。

ディスプレイの作業領域を取得します。作業領域は、タスクバー、ドッキングされたウィンドウ、およびドッキングされたツールバーを除く、ディスプレイのデスクトップ領域です。

それが役に立てば幸い

1
Fix