2011-02-08 39 views
9

基本的には、WPFウィンドウをフルスクリーンモードにしたい、F11を押すか、ウィンドウの右上隅の最大化ボタンを押したままにします。 F11を押すための魔法のように、次の作品ながらWPFフルスクリーン最大化

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.F11) 
    { 
     WindowStyle = WindowStyle.None; 
     WindowState = WindowState.Maximized; 
     ResizeMode = ResizeMode.NoResize; 
    } 
} 

これはまだ(Windowsの7でテスト済み)、Windowsのタスクバーが表示されます:

protected override void OnStateChanged(EventArgs e) 
{ 
    if (WindowState == WindowState.Maximized) 
    { 
     WindowStyle = WindowStyle.None; 
     WindowState = WindowState.Maximized; 
     ResizeMode = ResizeMode.NoResize; 
    } 
    base.OnStateChanged(e); 
} 

は、私はここで何をしないのですか?それとももっと優雅にすることができますか?

答えて

18

WPFは意思決定をしているようだ最大化の時にWindowStyleに基づいてタスクバーをフルスクリーンまたは尊重するかどうか。だから、クルージ的だが効果的な解決策は、非最大化、WindowStyleがセットに戻って、ウィンドウを切り替え、その後、再び最大化にウィンドウを設定することです:コードは、明らかに醜いです

private bool _inStateChange; 

protected override void OnStateChanged(EventArgs e) 
{ 
    if (WindowState == WindowState.Maximized && !_inStateChange) 
    { 
    _inStateChange = true; 
    WindowState = WindowState.Normal; 
    WindowStyle = WindowStyle.None; 
    WindowState = WindowState.Maximized; 
    ResizeMode = ResizeMode.NoResize; 
    _inStateChange = false; 
    } 
    base.OnStateChanged(e); 
} 

がNormalに移行し、マキシマイズに戻っても、ユーザーエクスペリエンスが悪化するとは思われません。私のディスプレイでは、F11コードとkludgeの両方でちらつきが最大になることがわかりましたが、kludgeを最大限に悪化させることはありませんでした。しかし、あなたの走行距離は変わるかもしれません!

+5

*ノックノック* - 誰がいるの? - '70からのセマフォ。いいですが、それは動作します。 +1 –

+0

これはうまく動作します。それは醜いですが、それは 'WindowInteropHelper'やフルスクリーンのような基本的なもののためのいくつかのDLLのインポートを実装することはまだ良い感じです。私はそれについて考えなければならない、一般的に良いアイデア! –

+1

実際、これは、WindowStateの両方の変更がWindows XPで視覚的に表現されているため、Window XPで醜い表示効果が発生します.Windows XPでは、青いタイトルバーが上下に移動し、この技法で魅力的なウィンドウが表示されます。 – cprcrack

3

Window.Topmost propertyを設定する必要があります。

編集

チェックあなたはuser32.dllのをインポートする場合は、タスクバーを非表示にすることができMaximizing window (with WindowStyle=None) considering Taskbar

+0

私は 'Topmost = true;'を試しましたが、動作を変更しません。 –

+0

タスクバーが「一番上に」設定されていますか?それはここで働く。 –

+0

愚かな質問です。タスクバーが「一番上に」設定されているかどうかを確認する方法を教えてください。私が言ったように、それはうまく動作します(F11を押すと 'Topmost'の有無にかかわらず)。 –

0

このブログの記事...

[DllImport("user32.dll")] 
private static extern int FindWindow(string className, string windowText); 
[DllImport("user32.dll")] 
private static extern int ShowWindow(int hwnd, int command); 

private const int SW_HIDE = 0; 
private const int SW_SHOW = 1; 

使用法:

int hwnd = FindWindow("Shell_TrayWnd",""); 
ShowWindow(hwnd,SW_HIDE); 
+5

! –

+0

フルスクリーンを終了するときにShowWindow(hwnd、SW_SHOW)を呼び出す必要があります... –

+0

ありがとうございました!とにかく、これは私にとってWPFのようなものではありませんでした。しかし、それはオプションになる可能性があります。 –

0

私はWPFでフルスクリーンを達成するための簡単な方法を発見した:これは、固定タスクバーとWindows 7で良い作品

private double LastHeight, LastWidth; 
    private System.Windows.WindowState LastState; 

    private void Window_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.F11) 
     { 
      if (WindowStyle != WindowStyle.None) 
      { 
       LastHeight = Height; 
       LastWidth = Width; 
       LastState = WindowState; 

       Topmost = true; 
       Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width; 
       Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height; 
       Top = 0; 
       Left = 0; 
       WindowState = System.Windows.WindowState.Normal; 
       WindowStyle = WindowStyle.None; 
       ResizeMode = System.Windows.ResizeMode.NoResize; 
      } 
      else 
      { 
       WindowStyle = WindowStyle.SingleBorderWindow; 
       WindowState = LastState; ; 
       ResizeMode = ResizeMode.CanResizeWithGrip; 
       Topmost = false; 
       Width = LastWidth; 
       Height = LastHeight; 
      } 
     } 
    } 

+0

この方法は、プログラムが常に左側の画面で最大化されるため、デュアルスクリーンマシンでプログラムを実行しているときは機能しません。 –

3

私のために働いていた別の解決策:

あなたは、コンストラクタを使用して SystemParameters.MaximizedPrimaryScreenHeightにそのウィンドウのmaxHeightプロパティを設定することができます。

public MainWindow() 
{ 
    InitializeComponent(); 
    this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight; 
} 

警告:これは、拡張デスクトップ上で動作しない場合があります。

出典:Maximize window with WindowState Problem (application will hide windows taskbar)

2

あなたのウィンドウがすべての画面をカバーし、なめらかなを必要とする誰かがまだある場合は、Windowsのタスクバー

+0

Windows 10の他のどの製品より優れていました! (記念日の更新) –

1

ですべてを非表示になります見ることができます。この

Topmost="True" and WindowState="Maximized" 

を試してみてくださいもちろん、フルスクリーンはWindows 10でのみテストされています!あなたがこのコードオーダーを維持するならば、最小化されたウィンドウ10ではちらつきが少なくなります!

public bool IsFullscreen = false; 
    public WindowState lastWindowState; 
    private void player_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     if (IsFullscreen) 
     { 
      this.WindowStyle = WindowStyle.SingleBorderWindow; 
      this.WindowState = lastWindowState; 
      IsFullscreen = false; 

     } 
     else 
     { 
      lastWindowState = this.WindowState; 

      this.WindowStyle = WindowStyle.None; 
      if (this.WindowState == WindowState.Maximized) 
       this.WindowState = WindowState.Minimized; 
      this.WindowState = WindowState.Maximized; 
      IsFullscreen = true; 
     } 
    } 
+0

おかげで、Windows XPとWindows 7でもうまくいきます。 – dbostream

+0

この回答の問題は、Maximizeボタンの動作を変更する方法が質問されている間に、MouseDoubleClickイベントを使用することです。これはうまくいくが、この例で使用されたイベントが変更されて質問に対処する方が良いだろう。 –

1

カスタムクロームの経験を作成するためにWindowChromeを使用することが起こる場合は、0以外の何か(少なくとも私はタスクバーを得るために行うために必要な最後のものだったことにGlassFrameThicknessを設定する必要があります窓の後ろに隠される)。それは、受け入れられた答えに示されているステップに加えてあります。

0

私の場合、最小化と最大化は画面全体のサイズを画面より少し大きくするため、再描画を強制するためにVisibilityをCollapsedに、Visibleに一時的に設定する方法があります。

Visibility = Visibility.Collapsed; 
WindowStyle = WindowStyle.None; 
WindowState = WindowState.Maximized; 
ResizeMode = ResizeMode.NoResize; 
Visibility = Visibility.Visible; 
関連する問題