Как установить текст в заголовке RibbonApplicationMenu
Я пытаюсь получить текст на верхнем уровне RibbonApplicationMenu (пытаюсь получить там слово "Файл", похожее на Word или Outlook). Кажется Microsoft.Windows.Controls.Ribbon.RibbonApplicationMenu
http://msdn.microsoft.com/en-us/library/microsoft.windows.controls.ribbon.ribbonapplicationmenu.aspx поддерживает SmallImageSource, но не имеет текстового свойства. Настройка Label
свойство не работает для этой проблемы.
xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
<ribbon:RibbonApplicationMenu Label="File"> <!--doesn't set the label -->
</ribbon:RibbonApplicationMenu>
Цель состоит в том, чтобы слово "Файл" появилось в обведенной ниже области.
5 ответов
Самым простым решением (для меня) было вставить DrawingImage с GlyphRun внутри. В отдельном посте спрашивается, как получить AdvanceWidths и GlyphIndicies для GlyphRun. Результат ниже
<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>
Результирующая лента:
Удалите ненужные элементы для визуального дерева и замените их на TextBlock, который берет текст из свойства Label. Вы должны сделать это как для кнопки в основном визуальном дереве, так и для визуального дерева всплывающего окна. Наконец, поскольку текст более сложный, чем обычное изображение, полезно отменить эффекты аэросъемки.
Чтобы использовать следующий код, присвойте имя меню приложения в XAML и вызовите ReplaceRibbonApplicationMenuButtonContent
с этим из обработчика события Loaded окна.
/// <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);
}
Правильно. Если вы не хотите использовать выделение кода и сложные вычисления глифов, используйте следующий XAML:
<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>
Преимущества этого подхода:
- Только XAML, без кода
- Нет измерения глифа
- Легко изменить этикетку
Tricky! Возможно, вам придется заменить PART_ToggleButton шаблона своей собственной версией, чтобы иметь возможность установить текст.
Использование WPF Vizualizer показывает, что шаблон содержит StackPanel с изображением и путем (DownArrow), но без TextBlock, поэтому я сомневаюсь, что в текущем элементе управления есть место для указания текста метки.
Конечно, вы также можете создать изображение, которое содержит нужный текст.
Другой способ сделать это - просто использовать сетку и нарисовать TextBlock в нужном месте. Обязательно сделайте TextBlock НЕ 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>
Преимущества:
- меньше xaml
- гораздо проще локализовать
Недостаток: - выглядит менее красиво на Windows XP
Следующее решение было размещено на форуме MSDN. Это включает в себя изменение стиля, используемого в теме по умолчанию (?).
Я проверил исходный код элементов управления ленты (пожалуйста, загрузите MicrosoftRibbonForWPFSourceAndSamples с веб-сайта). В файле темы (
\MicrosoftRibbonForWPFSourceAndSamples\RibbonControlsLibrary\Themes\Generic.xaml
) ленты, вы можете найти этот стильÜ
"привык кRibbonApplicationMenu
, В этом стиле нет элемента для отображения текста, он имеет только один элемент изображения для отображения изображения.К счастью, мы могли бы изменить код стиля и добавить некоторые элементы управления в "
Ü
"Стиль. Пожалуйста, под кодом:строка 7264, измените код:
<!--<Image IsHitTestVisible="False" Source="{Binding RelativeSource ={RelativeSource FindAncestor, AncestorType ={x:Type ribbon:RibbonApplicationMenu}},
Path = SmallImageSource} "HorizontalAlignment =" Center "VerticalAlignment =" Center "Width =" 16 "Height =" 16 "RenderOptions.BitmapScalingMode =" NearestNeighbor "RenderOptions.EdgeMode =" Aliased "/> ->
строка 7433, добавьте код
Label="{TemplateBinding Label}"
в концеRibbonToggleButton
элемент:...... <ControlTemplate TargetType="{x:Type ribbon:RibbonApplicationMenu}"> <Grid Focusable="False" x:Name="OuterGrid" SnapsToDevicePixels="True"> <ribbon:RibbonToggleButton x:Name="PART_ToggleButton" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" Style="{StaticResource Ü}" FocusVisualStyle="{TemplateBinding FocusVisualStyle}" Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height}" Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Width}" ToolTipTitle="{TemplateBinding ToolTipTitle}" ToolTipDescription="{TemplateBinding ToolTipDescription}" ToolTipImageSource="{TemplateBinding ToolTipImageSource}" ToolTipFooterTitle="{TemplateBinding ToolTipFooterTitle}" ToolTipFooterDescription="{TemplateBinding ToolTipFooterDescription}" ToolTipFooterImageSource="{TemplateBinding ToolTipFooterImageSource}" SmallImageSource="{TemplateBinding SmallImageSource}" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsDropDownOpen, Mode=TwoWay}" Label="{TemplateBinding Label}"/>
строка 7564, добавьте код
Label="{TemplateBinding Label}"
в концеRibbonToggleButton
элемент:...... <Canvas> <ribbon:RibbonToggleButton x:Name="PART_PopupToggleButton" AutomationProperties.Name="{Binding RelativeSource={RelativeSource TemplatedParent},
Path = (AutomationProperties.Name)} "Canvas.Top =" - 24 "Canvas.Left =" 3 "IsChecked =" {Binding RelativeSource = {RelativeSource TemplatedParent}, Path = IsDropDownOpen} "BorderBrush =" {TemplateBinding BorderBrush} "Фон = "{TemplateBinding Background}" BorderThickness = "{TemplateBinding BorderThickness}"
Style = "{StaticResource Ü}" Focusable = "False" Height = "{Binding RelativeSource = {RelativeSource TemplatedParent}, Path = Высота}" Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Width}" Label="{TemplateBinding Label}"/> И в RibbonWindow мы могли бы установить свойство Label RibbonApplicationMenu как:<ribbon:RibbonApplicationMenu Label="File">
Сообщение на форуме содержало ZIP с измененными источниками, но ссылка больше не работает.