【问题标题】:WPF full screen on maximizeWPF全屏最大化
【发布时间】:2011-06-23 18:40:25
【问题描述】:

我基本上想让我的 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);
}

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

【问题讨论】:

    标签: c# wpf fullscreen


    【解决方案1】:

    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 maximise 都闪烁,但在 kludge maximise 上没有明显更糟。但您的里程可能会有所不同!

    【讨论】:

    • 敲敲 - 谁在那儿? - 70 年的信号量。不错的一个,它的工作原理。 +1
    • 这个很好用。即使它很丑,感觉还是比实现WindowInteropHelper 或一些 dll 导入来实现全屏等基本功能要好。我得考虑一下,总体来说是个好主意!
    • 事实上,这在 Window XP 中产生了一种丑陋的可见效果,因为 WindowState 的两个变化在 Windows XP 中都有一个可视化的表示,它是一个上下移动的蓝色标题栏,给人一种醉酒的窗口吸引力这种技术。
    【解决方案2】:

    试试这个

    Topmost="True" and WindowState="Maximized"
    

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

    【讨论】:

    • 在 Windows 10 上工作得比其他任何人都好! (周年更新)
    【解决方案3】:

    【讨论】:

    • 我试过Topmost = true;,它不会改变行为。
    • 愚蠢的问题。如何检查我的任务栏是否设置为“最顶部”。正如我所说,它工作正常(有和没有Topmost)按 F11。
    • 好问题,看来您无法在 Windows 7 中更改它。我会进行更多测试并回复您。
    • 谢谢,非常感谢。这种行为让我发疯;)
    • 这对我不起作用——奇怪的是,它会剪切任务栏的部分,而不是全部(带有 Aero 主题的 Server 2008)。
    【解决方案4】:

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

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

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

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

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

    【讨论】:

      【解决方案5】:

      如果您碰巧使用 WindowChrome 创建自定义 chrome 体验,则需要将 GlassFrameThickness 设置为 0 以外的值(至少这是我获得任务栏所需做的最后一件事隐藏在窗户后面)。这是在接受的答案中提供的步骤之外的。

      【讨论】:

        【解决方案6】:

        如果还有人需要流畅的全屏当然只能在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;
                }
            }
        

        【讨论】:

        • 谢谢,在 Windows XP 和 Windows 7 上也能很好地工作。
        • 这个答案的一个问题是它使用 MouseDoubleClick 事件,而问题询问如何更改最大化按钮的行为。虽然这会起作用,但最好是更改此示例中使用的事件以解决问题。
        【解决方案7】:

        如果导入 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);
        

        【讨论】:

        • 你刚刚破坏了我的任务栏!
        • 谢谢kzen!无论如何,这对我来说并不是很 WPF。但这可能是一种选择。
        • 它实际上只是删除了我在任务栏中的所有图标,它并没有删除任务栏本身。
        【解决方案8】:

        我找到了在 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 中运行良好。

        【讨论】:

        • 在双屏机器上运行程序时,这种方式不起作用,因为程序总是在左侧屏幕上最大化。
        【解决方案9】:

        在我的情况下,最小化和最大化会使全屏尺寸比屏幕大一点,所以我发现的替代方法是暂时将 Visibility 设置为 Collapsed 然后再回到 Visible 以强制重绘。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-21
          • 1970-01-01
          相关资源
          最近更新 更多