我在 StackOverflow
上找到了一些有关我的问题的信息,因此我将以下 XAML
代码引入到我的窗口中。
现在一切都很好,但 WPF
窗口没有快速启动图标或上下文选项卡处于事件状态。
有没有办法通过XAML
代码使应用程序标题完全居中。
<ribbon:Ribbon.TitleTemplate>
<DataTemplate>
<TextBlock TextAlignment="Center" HorizontalAlignment="Stretch"
Width="{Binding ElementName=Window, Path=ActualWidth}">ApplicationTitle
<TextBlock.Effect>
<DropShadowEffect ShadowDepth="0" Color="MintCream " BlurRadius="10"/>
</TextBlock.Effect>
</TextBlock>
</DataTemplate>
</ribbon:Ribbon.TitleTemplate>
最佳答案
这是一种非常幼稚的方法。它来自于检查 RibbonWindow
及其伴随的 Ribbon
的可视化树。我已经使用这段代码几个小时了(现在已经不再了)——它的边缘有点粗糙,我不确定它是否完全没有错误。需要进行一些优化,并且应该指出的是,我对 WPF 很烂;可能有更好的方法来做事。
代码如下,但首先请注意:
对
PART_Icon
模板的引用与您的问题没有直接关系,但与窗口的美观有关。对
IsWin8OrHigher
和FindChild
的引用位于我将在最后包含的类中。我对 Windows 8 的兴趣在于, native 功能区库将标题文本居中,而早期版本的 Windows 则不然。我试图在这里模仿这一点。我不知道
RibbonWindow
是如何在当前版本的 Visual Studio 2012 中附带的。 Windows 8 上的渲染看起来非常糟糕。毕竟,我很想用TextBlock
重载TitleTemplate
来摆脱默认发光并保留它。RibbonWindow
最大化后看起来不太好,无论是否自定义。
当我开始编写这段代码时,这大约是我的目标:
为了进行比较,这是 RibbonWindow
在没有自定义的情况下呈现自身的方式:
这是使用 TitleTemplate
定义到 TextBlock
并使用 TextAlignment="Center"
进行渲染的方式,但没有任何花哨的文本效果:
使用下面的代码,我们得到这个结果:
主窗口:
public partial class MainWindow {
public MainWindow() {
InitializeComponent();
if (Environment.OSVersion.IsWin8OrHigher()) {
SizeChanged += (sender, args) => TitleHack();
Activated += (sender, args) => TitleHack();
}
}
public override void OnApplyTemplate() {
base.OnApplyTemplate();
if (!Environment.OSVersion.IsWin8OrHigher())
return;
var icon = GetTemplateChild("PART_Icon") as Image;
if (icon == null)
return;
icon.Margin = new Thickness(icon.Margin.Left + 3, icon.Margin.Top + 2,
icon.Margin.Right, icon.Margin.Bottom);
}
private void TitleHack() {
var ribbonTitlePanel = MyRibbon.FindChild<FrameworkElement>("PART_TitlePanel");
var qatTopHost = MyRibbon.FindChild<FrameworkElement>("QatTopHost");
var titleHost = MyRibbon.FindChild<FrameworkElement>("PART_TitleHost");
var tabGroup = MyRibbon.FindChild<FrameworkElement>("PART_ContextualTabGroupItemsControl");
var qatTopHostLeft = qatTopHost.TransformToAncestor(ribbonTitlePanel).Transform(new Point(0, 0)).X;
var tabGroupLeft = tabGroup.TransformToAncestor(ribbonTitlePanel).Transform(new Point(0, 0)).X;
var width = ribbonTitlePanel.ActualWidth;
if (tabGroup.Visibility == Visibility.Visible) {
width -= tabGroup.ActualWidth;
width -= tabGroupLeft - qatTopHostLeft;
} else {
width -= qatTopHost.ActualWidth;
}
if (ResizeMode != ResizeMode.NoResize && WindowStyle != WindowStyle.None)
width -= 48; // For the min and max buttons
titleHost.Width = width > 0 ? width : Double.NaN;
}
}
OperatingSystemExtensionMethods.cs:
public static class OperatingSystemExtensionMethods {
private static readonly Version Windows8Version = new Version(6, 2);
public static bool IsWin8OrHigher(this OperatingSystem that) {
if (that.Platform != PlatformID.Win32NT)
return false;
return that.Version.CompareTo(Windows8Version) >= 0;
}
}
DependencyObjectExtensionMethods.cs:
public static class DependencyObjectExtensionMethods {
public static T FindChild<T>(this DependencyObject that, string elementName)
where T : FrameworkElement {
var childrenCount = VisualTreeHelper.GetChildrenCount(that);
for (var i = 0; i < childrenCount; i++) {
var child = VisualTreeHelper.GetChild(that, i);
var frameworkElement = child as FrameworkElement;
if (frameworkElement != null && elementName == frameworkElement.Name)
return (T) frameworkElement;
if ((frameworkElement = frameworkElement.FindChild<T>(elementName)) != null)
return (T) frameworkElement;
}
return null;
}
}
关于wpf - 通过 XAML 代码居中 WPF RibbonWindow 标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7345422/