2009-09-23 21 views
17

最大化するとENTIRE(タスクバーさえ表示されません)の不動産を占めるWindows Media PlayerまたはブラウザベースのFlash Playerと同じ効果を実現します。WPFウィンドウのスタイル=なしアプリケーションの初期化後に最大化するとタスクバーをカバーする

WindowStateMaximizedに設定され、アプリがその状態で起動されるようにWindowStyleは、XAMLでNoneに設定されている場合、これは正常に動作します。問題は、ボーダーウィンドウでアプリを起動したい場合と、ユーザーが選択したときに上記のように最大化することです。 StateChangedハンドラでは、私はMaximizedの状態をチェックし、この場合、私はWindowStyleNoneに設定しました。これは、ウィンドウを最大化する効果がありますが、タスクバーをカバーしません。次のコードは、私が好きなこの作業を行うが、そのハックと私はそれをきれいにしたいと思います(まだCTP 2006年から)

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(); 
} 

EDITThisは、MSから問題と誰かに言及します次のバージョンでフルスクリーンサポートを改善することを希望している状態で、これらの改善が行われましたか?

+0

この問題はまだ生きており、WPF/.NET 4.0のすべての最新バージョンでうまくいきます... - Microsoftは、このバグが後方互換性があるように思っています。私は少し違って、Hideを呼び出し、プロパティを設定して、Showを呼び出します。 – BrainSlugs83

+0

まあまあ。私のコントロールのいくつかが適切にサイズ変更されていないことに気付きました。なぜ、(私の注文でも、あなたの注文でも)理由が分かりません。クイックソリューションは、最大化するDoEvents()を呼び出し、WindowStyleをNoneに設定し、Hide&Showを呼び出します。 DoEventsはもちろんSystem.Windows.Forms.Application.DoEvents()です(はい、私はそれが気違いで、おそらく最悪の習慣であることを知っていますが、動作します...) – BrainSlugs83

答えて

13

この記事ではすべて説明します:Maximizing window (with WindowStyle=None) considering Taskbar

またチェックアウトする価値があります:Custom Window Chrome in WPF

編集:今新しい、サイズ変更、移動、再実装の頭痛ずにウィンドウクロムの完全なスタイルを変更することができますWPFシェルの統合図書館などで

2015は編集:シェルの統合図書館は今WPFに統合し、MSは、これはあなたのためにOKであれば

+0

Thanks Eduardo。私はそれを読んでいましたが、Win32を必要としないソリューションがあることを願っていました。私は上に言及したハックのように、何かがなければならないと確信しています。 –

+0

動作は設計上のため、BabySmashのようなすべてのデスクトップを取るウィンドウを持つことができるので、ありません。 –

+1

WindowStyle = NoneとWindowState = Maximizedでウィンドウを最初に読み込んだときにタスクバーが隠されていても、読み込まれた後にウィンドウを最大化すると、そうではありません。 –

1

は、私にはわからないコードを引退していますが、作業領域と同じ大きさ(つまり、ほとんどの場合、すべての画面を持つようにウィンドウのサイズを変更することができますタスクバーを除く)、0,0(左上隅)に配置します。

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

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

は、ディスプレイの作業領域を取得します。作業領域は、タスクバー、ドッキングされたウィンドウ、ドッキングされたツールバーを除く、ディスプレイのデスクトップ領域です。ちらつきがあり

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

が、これは正しく私が入るたびに、この関数を呼び出すか、終了フルスクリーンモード午前私のWPF/.NET 4.0のアプリケーションで動作するように取得するには

+0

タスクバーが上にある場合はどうなりますか?または、複数のモニターがありますか? –

+0

この場合、期待どおりに動作しません。 – Fix

+0

ええ、私は同じ考えを持っていましたが、同じ反対に来ました。残念なことに、アプリケーションがどのモニターにあるかを照会し、そのモニターのRECTを取得するのは簡単ではありません...おそらくそれを行うためのinterop呼び出しがありますが、それをスクリューします。 – BrainSlugs83

2

を役に立てば幸いこの方法には関連していますが、Chromeでフルスクリーンモードに切り替えると同じフリッカーが存在するようです。 Internet Explorerは異なるアプローチをとっているようです。

2

(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がセッターで最後が来ること:いくつかの実験の後、私はプロパティが設定されている順序が問題のようですました。

関連する問題