2011-07-14 27 views
21

Tôi đang cố gắng để có văn bản ở cấp cao nhất của RibbonApplicationMenu (cố gắng lấy từ "Tệp" có tương tự như Word hoặc Outlook). Có vẻ như Microsoft.Windows.Controls.Ribbon.RibbonApplicationMenuhttp://msdn.microsoft.com/en-us/library/microsoft.windows.controls.ribbon.ribbonapplicationmenu.aspx hỗ trợ SmallImageSource nhưng không có thuộc tính văn bản. Đặt thuộc tính Label không hoạt động cho vấn đề này.Cách đặt văn bản ở đầu của RibbonApplicationMenu

xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"  
<ribbon:RibbonApplicationMenu Label="File"> <!--doesn't set the label --> 

</ribbon:RibbonApplicationMenu> 

Mục đích là để từ "Tệp" xuất hiện trong khu vực được khoanh tròn bên dưới.

RibbonApplicationMenu

+5

Microsoft cần sửa lỗi này. – 00jt

Trả lời

21

Giải pháp đơn giản nhất (với tôi) là chèn DrawingImage với GlyphRun bên trong. Trên separate post được yêu cầu cách nhận AdvanceWidths và GlyphIndicies cho GlyphRun. Kết quả là dưới

<ribbon:RibbonApplicationMenu.SmallImageSource> 
    <DrawingImage> 
     <DrawingImage.Drawing> 
      <GlyphRunDrawing ForegroundBrush="White"> 
       <GlyphRunDrawing.GlyphRun> 
        <GlyphRun 
          CaretStops="{x:Null}" 
          ClusterMap="{x:Null}" 
          IsSideways="False" 
          GlyphOffsets="{x:Null}" 
          GlyphIndices="41 76 79 72" 
          FontRenderingEmSize="12" 
          DeviceFontName="{x:Null}" 
          AdvanceWidths="5.859375 2.90625 2.90625 6.275390625"> 
         <GlyphRun.GlyphTypeface> 
          <GlyphTypeface FontUri="C:\WINDOWS\Fonts\SEGOEUI.TTF"/> 
         </GlyphRun.GlyphTypeface> 
        </GlyphRun> 
       </GlyphRunDrawing.GlyphRun> 
      </GlyphRunDrawing> 
     </DrawingImage.Drawing> 
    </DrawingImage> 
</ribbon:RibbonApplicationMenu.SmallImageSource> 

Kết quả Ribbon:

GlyphRun Result

+0

Nhưng làm thế nào để bạn làm cho nó văn bản tùy chỉnh của riêng bạn là đúng kích cỡ? tôi đã cố gắng: GlyphIndices = "43 72 79 79 82 3 58 82 85 79 71" AdvanceWidths = "9,62666666666667 7,41333333333333 2,96 2,96 7,41333333333333 3,70666666666667 12,5866666666667 7,41333333333333 4,44 2,96 7,41333333333333" Và nó là "Hello World" .. nhưng nó siêu nhỏ. – 00jt

+6

Đây rõ ràng là điều cần được khắc phục ... nó CHỈ là: Nhãn = "Tệp" – 00jt

+7

@ 00jt +1. Tôi không thể tin rằng tôi phải đặt điều này bẩn thỉu để có được một cái gì đó rất đơn giản để làm việc (Tôi không nói câu trả lời là không tốt. Tôi thực sự nghĩ rằng nó tuyệt vời và tinh vi, nó chỉ là Microsoft thực sự thổi nó ở đây). – MasterMastic

2

Tricky! Bạn có thể phải thay thế PART_ToggleButton của mẫu bằng phiên bản của riêng bạn để có thể đặt văn bản.

Sử dụng trình phân tích WPF cho thấy mẫu có chứa một StackPanel với hình ảnh và đường dẫn (DownArrow), nhưng không có TextBlock, vì vậy tôi nghi ngờ rằng có một vị trí trong điều khiển hiện tại để chỉ định văn bản nhãn.

Tất nhiên, bạn cũng có thể tạo hình ảnh chứa văn bản mong muốn.

+0

Tôi xem xét việc tạo một hình ảnh có chứa chỉ là văn bản "File" một chút của một hack nhưng nó có lẽ sẽ làm việc. –

+0

Đáng chú ý là nhiều nhược điểm của hack: Văn bản sẽ mờ ở DPI khác với 96; Các điều chỉnh văn bản ClearType sẽ không hoạt động; khó bản địa hóa hơn; sẽ không có giá trị với trình đọc màn hình. –

13

Xóa các phần tử không mong muốn cho cây thị giác và thay thế chúng bằng một TextBlock lấy văn bản từ thuộc tính Nhãn. Bạn phải làm điều này cho cả hai nút trên cây thị giác chính và trên cây thị giác của cửa sổ bật lên. Cuối cùng, vì văn bản phức tạp hơn so với hình ảnh thông thường, nên hữu ích khi tắt các hiệu ứng làm nổi bật aero.

Để sử dụng mã sau, hãy gán tên cho menu ứng dụng trong XAML và gọi ReplaceRibbonApplicationMenuButtonContent với nó từ trình xử lý sự kiện được tải của cửa sổ.

/// <summary> 
/// Replaces the image and down arrow of a Ribbon Application Menu Button with the button's Label text. 
/// </summary> 
/// <param name="menu">The menu whose application button should show the label text.</param> 
/// <remarks> 
/// The method assumes the specific visual tree implementation of the October 2010 version of <see cref="RibbonApplicationMenu"/>. 
/// Fortunately, since the application menu is high profile, breakage due to version changes should be obvious. 
/// Hopefully, native support for text will be added before the implementation breaks. 
/// </remarks> 
void ReplaceRibbonApplicationMenuButtonContent(RibbonApplicationMenu menu) 
{ 
    Grid outerGrid = (Grid)VisualTreeHelper.GetChild(menu, 0); 
    RibbonToggleButton toggleButton = (RibbonToggleButton)outerGrid.Children[0]; 
    ReplaceRibbonToggleButtonContent(toggleButton, menu.Label); 

    Popup popup = (Popup)outerGrid.Children[2]; 
    EventHandler popupOpenedHandler = null; 
    popupOpenedHandler = new EventHandler(delegate 
    { 
     Decorator decorator = (Decorator)popup.Child; 
     Grid popupGrid = (Grid)decorator.Child; 
     Canvas canvas = (Canvas)popupGrid.Children[1]; 
     RibbonToggleButton popupToggleButton = (RibbonToggleButton)canvas.Children[0]; 
     ReplaceRibbonToggleButtonContent(popupToggleButton, menu.Label); 
     popup.Opened -= popupOpenedHandler; 
    }); 
    popup.Opened += popupOpenedHandler; 
} 

void ReplaceRibbonToggleButtonContent(RibbonToggleButton toggleButton, string text) 
{ 
    // Subdues the aero highlighting to that the text has better contrast. 
    Grid grid = (Grid)VisualTreeHelper.GetChild(toggleButton, 0); 
    Border middleBorder = (Border)grid.Children[1]; 
    middleBorder.Opacity = .5; 

    // Replaces the images with the label text. 
    StackPanel stackPanel = (StackPanel)grid.Children[2]; 
    UIElementCollection children = stackPanel.Children; 
    children.RemoveRange(0, children.Count); 
    TextBlock textBlock = new TextBlock(new Run(text)); 
    textBlock.Foreground = Brushes.White; 
    children.Add(textBlock); 
} 
+1

Cho đến nay, cái này phải là giải pháp được chấp nhận ... –

1

Một cách khác để làm như vậy chỉ được sử dụng một mạng lưới và sơn một TextBlock ở đúng nơi. Hãy chắc chắn để làm cho TextBlock NOT HitTestVisible.

<Grid> 
    <DockPanel> 
     <ribbon:Ribbon DockPanel.Dock="Top"> 
      <!-- your ribbon stuff --> 
     </ribbon:Ribbon> 
     <!-- your other stuff --> 
    </DockPanel> 
    <TextBlock Margin="3,26" Foreground="White" 
       IsHitTestVisible="False" 
       Text="{LocalizeExtension:LocText Key=FILE, Dict=Strings, Assembly=YourAssembly}"/> 
</Grid> 

Ưu điểm:

  • ít XAML
  • cách dễ dàng hơn để bản địa hoá

Nhược điểm: - có vẻ ít đẹp trên Windows XP

+1

Tôi đã thử tùy chọn của bạn, nhưng khi tôi nhấp vào RibbonApplicationMenu, văn bản bị ẩn. Nó chỉ hiển thị "Tệp" nếu nó không hiển thị menu thả xuống. – 00jt

+0

bạn đúng về điều đó ... bạn lại có thể sử dụng một TextBlock tại RibbonMenu xuất hiện nhưng tôi personelly đã không nghĩ rằng sẽ rất quan trọng –

0

Đúng vậy.Nếu bạn muốn không có mã-đằng sau và không có tính hình tượng phức tạp, sử dụng XAML sau:

<RibbonApplicationMenu.SmallImageSource> 
    <DrawingImage> 
    <DrawingImage.Drawing> 
     <GeometryDrawing> 
     <GeometryDrawing.Geometry> 
      <RectangleGeometry Rect="0,0,20,20"></RectangleGeometry> 
     </GeometryDrawing.Geometry> 
     <GeometryDrawing.Brush> 
      <VisualBrush Stretch="Uniform"> 
      <VisualBrush.Visual> 
       <TextBlock Text="File" FontSize="16" Foreground="White" /> 
      </VisualBrush.Visual> 
      </VisualBrush> 
     </GeometryDrawing.Brush> 
     </GeometryDrawing> 
    </DrawingImage.Drawing> 
    </DrawingImage> 
</RibbonApplicationMenu.SmallImageSource> 

Ưu điểm của phương pháp này:

  • XAML chỉ, không có code-behind
  • Không glyph đo lường
  • Dễ dàng thay đổi nhãn
Các vấn đề liên quan