在应用初始化后最大化时,带样式=无的WPF窗口覆盖任务栏

时间:2009-09-23 09:25:04

标签: wpf layout resize

我希望获得与Windows Media Player或基于浏览器的Flash播放器相同的效果,这些播放器在最大化时会占用整个区域(甚至任务栏都不可见)。

如果WindowState设置为Maximized并且WindowStyle在XAML中设置为None,则此工作正常,以便应用程序在该状态下启动。问题是我想在一个有边框的窗口中启动应用程序,当用户选择时,如上所述最大化。在StateChanged处理程序中,我检查了Maximized状态,如果是这种情况,我将WindowStyle设置为None。这具有最大化窗口但不覆盖任务栏的效果。下面的代码将使我的工作正常,但它是一个黑客,我想清理它:

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

编辑 This(从2006年开始使用CTP时)提到了这个问题,来自MS的某些人希望在下一版本中改进全屏支持,是否已经进行了这些改进?

4 个答案:

答案 0 :(得分:14)

本文解释了所有内容:Maximizing window (with WindowStyle=None) considering Taskbar

另外值得一试:Custom Window Chrome in WPF

编辑:现在是新的,是WPF Shell集成库,它允许完整的窗口chrome重新设置,而不会出现重新实现移动,调整大小等问题的麻烦。

编辑2015 :Shell集成库现已集成在WPF中,MS退出了代码

答案 1 :(得分:3)

我发现通过在创建窗口时设置属性(在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;            
        }
    }
}

请注意,setter中的 WindowState是最后的

答案 2 :(得分:2)

为了让我在WPF / .NET 4.0应用程序中正常工作,每当我进入或退出全屏模式时,我都会调用此函数:

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

此方法存在闪烁,但在Chrome上进入全屏模式时似乎存在相同的闪烁。 Internet Explorer似乎采取了不同的方法。

答案 3 :(得分:1)

我不知道这对你是否合适,但你可以调整窗口大小以使其大小与工作区域相同(即,在大多数情况下,除了任务栏以外的所有屏幕)并将其定位为0 ,0(左上角):

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

WorkingArea属性(来自MSDN)的确切定义是:

获取显示的工作区域。工作区域是显示器的桌面区域,不包括任务栏,停靠窗口和停靠工具栏。

希望有所帮助