2011-09-08 40 views
1

我發現了一些關於我的問題的信息,因此我將以下xaml代碼引入到了我的窗口中。 現在一切正常,而wpf窗口沒有快速啓動圖標或上下文選項卡處於活動狀態。通過XAML代碼中心WPF RibbonWindow標題

有沒有辦法通過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> 
+0

+1我一直在試圖找出周圍的'RibbonWindow'自帶的可怕默認標題模板的方式。這給了我一個解決方法。但是,我發現使用快速訪問工具欄和上下文選項卡時遇到的問題。 –

+0

查看窗口的可視化樹,標題部分最終處於「DockPanel」內部。據我所知,他們不提供那麼多的佈局功能。 –

+0

根本問題是,功能區使用帶有專有佈局算法的「RibbonTitlePanel」,該算法將標題放在任何上下文選項卡的右側。我想你可以從'RibbonTitlePanel'派生一個類,並提供一個更好的佈局算法,但是要將它鉤到'Ribbon'控件中,需要修改'Ribbon'控件模板,然後獲取該模板的副本似乎是一項艱鉅的任務。 –

回答

2

這裏是一個非常簡單的方式來做到這一點。它來自檢查RibbonWindow及其伴隨Ribbon的視覺樹。我一直在玩這個代碼幾個小時(不再) - 這有點粗糙,我不確定它完全沒有bug。有一些優化,應該指出,我吮吸WPF;有可能有更好的方式來做事情。

對於什麼是值得的代碼如下,但要注意第一:

  • PART_Icon模板引用不直接關係到你的問題,但它關係到窗戶的美觀。

  • IsWin8OrHigherFindChild的引用是我將在最後包含的類。我對Windows 8的興趣在於,本地功能區庫集中了標題文本,而Windows的早期版本則沒有。我試圖在這裏效仿。

  • 我不知道RibbonWindow在當前迭代中是如何隨Visual Studio 2012一起提供的。 Windows 8上的渲染看起來相當悲慘。在所有這些之後,我試圖用TextBlock來重載TitleTemplate以擺脫默認發光,並將其留在那裏。

  • RibbonWindow看起來不是很好,最大化,定製或不。

當我開始寫這個代碼,這大約是什麼,我瞄準了:

enter image description here

爲了便於比較,這是RibbonWindow如何呈現自己沒有定製:

enter image description here

這是它如何與呈現10定義爲一個TextBlockTextAlignment="Center"但除此之外,沒有任何花哨的文字效果:

enter image description here

與下面的代碼中,我們得到這樣的結果:

enter image description here

MainWindow.cs

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; 
    } 
} 
1

這應該是工作的罰款。我剛剛測試過它和標題中心。

+1

我沒有任何上下文選項卡活動它是好的,但與上下文選項卡激活它中心到寬度的其餘部分開始在上下文選項卡的結尾。無論如何,我都在尋找整個標題欄的解決方案。 – Lif3styl3

0

如果你想真正的中心,它需要:

HorizontalAlignment="Center"