我使用Microsoft功能区为WPF创建了一个应用程序。我使用RibbonWindow而不是简单的Window将QuickAccessToolbar放置到窗口标题。
问题是当我设置
时,普通窗口会变为全屏 WindowStyle="None"
WindowState="Maximized"
但是RibbonWindow变得更大,其底部隐藏在任务栏后面。
我认为window和RibbonWindows之间的唯一区别是controlTemplate。 但我真的不明白我怎么能通过模板将窗口放在任务栏上方。
如何像普通窗口一样展示我的RibbonWindow 上面任务栏的任何想法吗?
Link to the VS2010 project (10KiB)(不包括Microsoft Ribbon For WPF)
答案 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;
}