RibbonWindow中的WPF全屏

时间:2011-08-05 12:11:59

标签: wpf fullscreen ribbon

我使用Microsoft功能区为WPF创建了一个应用程序。我使用RibbonWindow而不是简单的Window将QuickAccessToolbar放置到窗口标题。

问题是当我设置

时,普通窗口会变为全屏
  WindowStyle="None"
  WindowState="Maximized"

但是RibbonWindow变得更大,其底部隐藏在任务栏后面。

我认为window和RibbonWindows之间的唯一区别是controlTemplate。 但我真的不明白我怎么能通过模板将窗口放在任务栏上方。

如何像普通窗口一样展示我的RibbonWindow 上面任务栏的任何想法吗?

Link to the VS2010 project (10KiB)(不包括Microsoft Ribbon For WPF)

2 个答案:

答案 0 :(得分:1)

RibbonWindow使用自定义WindowChrome。这是行为不正确的原因。试试这段代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using Microsoft.Windows.Shell;

namespace Utils
{
    public static class WindowHelper
    {
        public static void Fullscreen(Window p_oWindow)
        {
            p_oWindow.WindowStyle = WindowStyle.None;
            p_oWindow.Topmost = true;
            p_oWindow.WindowState = WindowState.Maximized;
            WindowChrome.SetWindowChrome(p_oWindow, null);
        }

        public static void UndoFullscreen(Window p_oWindow)
        {
            p_oWindow.WindowStyle = WindowStyle.SingleBorderWindow;
            p_oWindow.Topmost = false;
            p_oWindow.WindowState = WindowState.Normal;
            WindowChrome.SetWindowChrome(p_oWindow, GetChrome());
        }

        public static WindowChrome GetChrome()
        {
            WindowChrome oCustomChrome = new WindowChrome();
            oCustomChrome.CornerRadius = new System.Windows.CornerRadius(0, 0, 0, 0);
            oCustomChrome.CaptionHeight = 0;
            oCustomChrome.ResizeBorderThickness = new System.Windows.Thickness(2, 2, 2, 2);
            return oCustomChrome;
        }
    }
}

答案 1 :(得分:0)

问题是WindowStyle。删除chrome时,会在所有WPF窗口中发生这种情况。 (他们真的为全屏自助服务终端应用优化了此功能。)

为了使窗口最大化到正确的大小,您需要自己处理它。单击最大化按钮后,您将需要获取当前监视器的工作区域。没有WPF方法,但您可以使用WinForms Screen类。

您的最大化方法如下:

// you must save the restore bounds, since we never set Window.WindowState,
// so the RestoreBounds property will get set to the maximized bounds
private System.Drawing.Rectangle restoreBounds;

private void DoMaximize(object sender, EventArgs e)
{
    var bounds = new System.Drawing.Rectangle((int)Left, (int)Top,
        (int)ActualWidth, (int)ActualHeight));
    var screen = System.Windows.Forms.Screen.FromRectangle(bounds);
    var area = screen.WorkingArea;

    restoreBounds = bounds; 

    Left = area.X;            
    Top = area.Y;          
    Width = area.Width;
    Height = area.Height;
}