WPF RibbonWindow + Ribbon =屏幕外标题?

Ath*_*ari 25 .net c# windows wpf ribbon

我正在尝试Ribbon控制与结合RibbonWindow,但即使在琐碎的实验中他们也失败了.

  1. 创建了新的WPF应用程序
  2. 将代码更改为MSDN中的示例
  3. 添加System.Windows.Controls.Ribbon了对ribbon:前缀的引用并删除了前缀(为什么示例过时了?).
  4. 添加了两个图标(16x16和32x32).
  5. 执行应用程序并看到此(记事本供参考):

我已经看到很多问题:

  1. 边界很小.普通窗口有一个很大的边框,WPF Ribbon应用程序很小.标题高度也较小.
  2. 边界模糊.当聚焦普通窗口时,它的边框是黑色的.WPF应用程序的边框是灰色的(黑色可以在角落中看到;有些东西是在边界上绘制的?).
  3. 应用程序图标放错了位置.它粘在左上角.
  4. 申请标题放错了地方.它粘在上面.

让我们将工具栏移动到底部.现在我们看到了这个:

按钮位于工具栏之外.

最后,让我们最大化窗口:

报头的一半消失在屏幕外部的(技术上窗口在屏幕的外部通过在每边8个像素,但其他应用不受此混淆).

我使用的是Windows 7,Aero,单显示器,没什么特别的.我害怕在Windows 8上测试应用程序...

有机会解决这个问题吗?

Jul*_*ain 30

真正的问题

在引擎盖下,WindowChrome类将其绑定ResizeBorderThicknessSystemParameters.WindowResizeBorderThickness其上,然后使用Win32 API GetSystemMetrics来确定系统边框大小.

但是,此方法的行为会根据可执行PE头中设置的子系统版本而更改.如果仅针对Windows Vista及更高版本(版本> = 6.0)进行编译,则它将返回比为旧操作系统编译时更薄的边框.在这个SO答案中有关于此的更多信息.

在针对.NET 4.5进行编译时,C#编译器将此版本设置为6.0,因为.NET 4.5不能在XP上使用.但是,WindowChrome该类似乎依赖于遗留行为,因此无法在Windows Vista和7上正确计算玻璃尺寸.

解决方案

使用.NET 4

您可以针对.NET 4进行编译,以强制编译器将4.0用作其子系统版本值.功能区可作为WPF 4 单独下载.请注意,即使使用此解决方案,也应在项目属性中取消选中"启用Visual Studio宿主过程"以进行调试.否则,将使用vshost.exe进程,该进程标记为子系统版本6.0.

更改子系统版本

编辑: Olly在评论中提供了一种方法:

在项目文件<subsystemversion>5.01</subsystemversion>中添加一个属性,该属性 错误地指示代码可以在Windows XP上运行.

忽略系统

您可以更改WindowChrome.WindowChrome窗口上的附加属性并使用所需的值,从而完全忽略系统值.你永远不应该这样做,但你可以.

填写错误

Connect上存在关于行为更改GetSystemMetrics的现有错误,但这一切都归结为子系统版本,因此它是Microsoft视点中的一个功能.但是,WindowChrome该类应该被修复以在Vista/7下正常工作,特别是因为它现在是在.NET 4.5中构建的.

  • 有人试过VS2012 Update2吗?<SubsystemVersion> 5.01 </ SubsystemVersion>和WindowChrome上的任何属性都没有任何影响. (6认同)
  • 对于C#,您可以设置编译器/子系统转换开关.(http://msdn.microsoft.com/en-us/library/vstudio/hh965708.aspx)我在项目文件<subsystemversion> 5.01 </ subsystemversion>中添加了一个属性,错误地表明该代码可以在Windows XP上运行.然后使用垫片,并且带状窗口看起来正常. (5认同)

Yan*_*ang 10

这是另一个WorkAround,非常简单和简单的方法.只需在工具栏中添加负边距即可.您需要保留原始Window类而不是RibbonWindow!

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Application Name" Height="350" Width="525" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged">
Run Code Online (Sandbox Code Playgroud)

只需将此边距添加到功能区标题即可

<Ribbon Title="" Foreground="#333333" Margin="0,-22,0,0">
Run Code Online (Sandbox Code Playgroud)

现在当你最大化窗口时,一切都保持正确

  • 是的,如果您不需要QuickAccessToolBar,这是一个快速简便的解决方案。 (2认同)

Ath*_*ari 7

对于读这个问题的人,我自己也在回答.忘记可怕的捆绑色带控制并使用其他东西.在这里寻找一些替代方案:什么是最好的WPF功能区控件套件?(就像所有好问题一样,它虽然已经关闭).

到目前为止,Fluent Ribbon Control Suite看起来对我来说是最好的免费选择.基本功能正常工作(没有边框问题和最大化,窗口调整不是很慢等等).它具有Office样式并在禁用玻璃时保留它们(这意味着您不会在Metro中看到Windows9x-ish窗口).它的界面(后台,QAT)更像Office 2010.

也许在一个遥远的未来,微软将修复它的功能区,但是现在,寻找替代品.


归档时间:

查看次数:

18644 次

最近记录:

10 年,9 月 前