WPF全屏最大化

时间:2011-02-08 22:23:56

标签: c# wpf fullscreen

我基本上希望让我的WPF窗口进入全屏模式,按下F11或按下窗口右上角的最大化按钮。

虽然下面的内容类似于按F11的魅力:

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

这仍将显示Windows任务栏(使用Windows 7测试):

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

我在这里缺少什么?或者我可以做得更优雅吗?

9 个答案:

答案 0 :(得分:19)

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然后再回到Maximized似乎并没有让用户体验更糟糕。在我的显示器上,我注意到F11代码和kludge最大化的闪烁,但在kludge最大化上没有明显更糟。但你的里程可能会有所不同!

答案 1 :(得分:3)

答案 2 :(得分:3)

另一个对我有用的解决方案:

  

您可以将该窗口的MaxHeight属性设置为   使用构造函数的SystemParameters.MaximizedPrimaryScreenHeight。

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

警告:这可能不适用于扩展桌面。

来源: Maximize window with WindowState Problem (application will hide windows taskbar)

答案 3 :(得分:2)

试试这个

Topmost="True" and WindowState="Maximized"

您可以看到您的窗口将覆盖所有屏幕并使用Windows任务栏隐藏所有内容

答案 4 :(得分:2)

如果您正在使用WindowChrome创建自定义Chrome体验,则需要将GlassFrameThickness设置为0以外的其他内容(至少这是我需要做的最后一件事)让TaskBar隐藏在窗口后面)。这是在接受的答案中提供的步骤之外的。

答案 5 :(得分:1)

如果还有人需要一个平滑的全屏,当然只在Windows 10上进行测试!在Windows 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;
        }
    }

答案 6 :(得分:0)

如果导入user32.dll ...

,则可以隐藏任务栏
[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);

答案 7 :(得分:0)

我找到了在WPF中实现全屏的简便方法:

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

这在带有固定任务栏的Windows 7中效果很好。

答案 8 :(得分:0)

在我的情况下,最小化和最大化会使全屏大小比屏幕大一点,所以我发现的另一种方法是暂时将可见性设置为折叠,然后再返回Visible以强制重绘。

Visibility = Visibility.Collapsed;
WindowStyle = WindowStyle.None;
WindowState = WindowState.Maximized;
ResizeMode = ResizeMode.NoResize;
Visibility = Visibility.Visible;