24

私は、RibbonApplicationMenu のトップ レベルにテキストを表示しようとしています ( FileWord や Outlook と同様に、そこに単語を取得しようとしています)。どうやらMicrosoft.Windows.Controls.Ribbon.RibbonApplicationMenu

MSDN

テキスト プロパティはサポートしていますが、テキスト プロパティはサポートしてSmallImageSourceいません。この問題では、プロパティの設定はLabel機能しません。

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

目標は、下の丸で囲まれた領域に「ファイル」という単語が表示されるようにすることです。

リボン アプリケーション メニュー

4

6 に答える 6

22

(私にとって) 最も簡単な解決策は、内部にGlyphRunを含むDrawingImageを挿入することでした。の投稿で、GlyphRun の AdvanceWidths と GlyphIndicies を取得する方法を尋ねられます。結果は以下

<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>

結果のリボン:

GlyphRun 結果

于 2011-07-18T20:27:57.280 に答える
14

ビジュアルツリーの不要な要素を削除し、Labelプロパティからテキストを取得するTextBlockに置き換えます。これは、メインのビジュアルツリーとポップアップのビジュアルツリーの両方のボタンに対して行う必要があります。最後に、テキストは通常​​の画像よりも複雑なので、エアロハイライト効果を元に戻すと便利です。

次のコードを使用するには、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);
}
于 2011-07-18T11:14:17.157 に答える
2

トリッキー!テキストを設定できるようにするには、テンプレートのPART_ToggleButtonを独自のバージョンに置き換える必要がある場合があります。

WPF Vizualizer を使用すると、テンプレートには Image と Path (DownArrow) を持つ StackPanel が含まれているが、TextBlock は含まれていないことがわかります。そのため、現在のコントロールにラベル テキストを指定する場所があるとは思えません。

もちろん、目的のテキストを含む画像を作成することもできます。

于 2011-07-14T19:32:11.633 に答える
1

これを行う別の方法は、グリッドを使用して適切な場所に 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 では見栄えが悪い

于 2012-02-16T14:40:11.450 に答える
0

次のソリューションは、MSDN フォーラムに投稿されました。デフォルト (?) テーマで使用されているスタイルを変更する必要があります。

リボン コントロールのソース コードを確認しました ( Web サイトから MicrosoftRibbonForWPFSourceAndSamplesをダウンロードしてください)。リボンのテーマ ファイル ( \MicrosoftRibbonForWPFSourceAndSamples\RibbonControlsLibrary\Themes\Generic.xaml) では、このスタイル " &#220;" が RibbonApplicationMenu. このスタイルでは、Text を表示する要素はなく、画像を表示する Image 要素が 1 つだけあります。

幸いなことに、スタイル コードを変更して、" &#220;" スタイルにいくつかのコントロールを追加することができました。以下のコードを使用してください:

行 7264、コードを変更します。

 <!--<Image IsHitTestVisible="False"
    Source="{Binding RelativeSource ={RelativeSource FindAncestor, AncestorType ={x:Type ribbon:RibbonApplicationMenu}},

Path=SmallImageSource}" Horizo​​ntalAlignment="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 &#220;}"
       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=Height}" Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Width}" Label="{TemplateBinding Label}"/> そして、RibbonWindow で、RibbonApplicationMenu の Label プロパティを次のように設定できます。

<ribbon:RibbonApplicationMenu Label="File">

フォーラムの投稿には変更されたソースの ZIP が含まれていましたが、リンクは機能しなくなりました。

于 2019-04-25T14:40:29.037 に答える