2009-09-23 48 views
17

我希望达到与基于Windows Media Player或基于浏览器的Flash播放器相同的效果,这些播放器在最大化时占用整个(甚至不是任务栏可见)实际占用的空间。WPF窗口样式=无覆盖任务栏当应用程序初始化时最大化

如果WindowState设置为Maximized等应用程序在该国开始WindowStyle设置为None在XAML这工作得很好。问题是我想在边框窗口中启动应用程序,当用户选择时,按照上面的指定最大化。在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问题,有人他们希望在下一个版本中改进全屏支持,是否进行了这些改进?

+0

这个问题仍然活着,并与WPF/.NET 4.0的所有最新版本... - 我想微软希望这个错误是向后兼容的...你的隐藏/显示修复工程很好,但...我在做我的一点不同,调用隐藏,设置属性,然后调用Show。 – BrainSlugs83 2011-09-18 08:56:54

+0

那该死的。我注意到我的一些控件没有正确调整大小,不知道为什么(无论是我的订单还是订单...);快速解决方案是最大化,调用DoEvents(),将WindowStyle设置为None,然后调用Hide&Show。 - DoEvents当然是System.Windows.Forms.Application.DoEvents()(是的,我知道这是疯了,也许是最坏的做法,但它的工作原理......) – BrainSlugs83 2011-09-18 09:47:36

回答

13

本文解释了这一切:Maximizing window (with WindowStyle=None) considering Taskbar

也值得一试:Custom Window Chrome in WPF

编辑:现在新的,是WPF外壳集成库,使窗口镶边的完整restyle没有重新实现移动,调整大小的头痛等

编辑2015年:外壳集成库现在是集成在WPF和MS中退役代码

+0

谢谢爱德华多。我曾读过,但希望有一个不需要Win32的解决方案。我相信肯定有东西,因为我上面提到的破解工作.... – 2009-12-22 20:10:27

+0

我想没有,因为行为是由设计,所以你可以有一个窗口,需要所有的桌面,如BabySmash。 – 2009-12-22 21:34:22

+1

是不是很奇怪,但最初加载窗口WindowStyle = None和WindowState = Maximized时,任务栏被遮挡,但在加载后最大化窗口时不是这种情况? – 2009-12-22 22:18:19

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属性的精确定义是:

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

希望它可以帮助

+0

如果任务栏位于顶部,该怎么办?或者你有多个显示器? – 2010-03-04 10:05:09

+0

在这种情况下,这将无法按预期工作。 – Fix 2010-10-27 14:21:09

+0

是的,我有同样的想法,但也提出了相同的反对意见。可惜这不是简单的查询应用程序在哪个监视器上,并获得该监视器的确切RECT ......可能有一些interop调用来做到这一点,但拧... – BrainSlugs83 2011-09-18 09:50:34

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似乎采取了不同的方法。

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在二传手最后出现

相关问题