0

2010年10月のWPFリボンのアプリケーションメニューのドロップ位置を変更することはできますか?メニューが一番左から開くのは珍しいと思いますので、変更したいと思います。

例:Word 2007(おそらくご存知のとおり)では、アプリケーションメニューが可能な限り右側に開きます。メニューの適切な位置は右側だけなので、この動作も取得したいと思います。そのすべてのエントリは、ボタンのすぐ下にあった左側の列にあります。左の位置を割り当てる簡単な方法は見つかりませんでした。誰かがこれが可能かどうか、そしてどのように可能か知っていますか?

4

1 に答える 1

0

さて、何時間もの試行錯誤の末、可能な方法を見つけました。「Windows 7 ペイント」や同様の Windows 7 リボン アプリケーションのような 100% オリジナルの動作ではありませんが、ほとんどの場合は機能します。

まず、アプリケーション メニューが で実現されていることを知っておく必要がありますPopup。これにはPlacement、ポップアップを開く場所を定義するプロパティがあります。デフォルトの動作を にオーバーライドする必要がありますPlacementMode.Left。これにより、メニューボタンのすぐ隣にポップアップメニューが開きます。

次に、Popup.HorizontalOffsetプロパティを negatedに設定する必要がありますRibbonApplicationMenu.Width。これは、Binding と値を無効にするコンバーターを介して行われます。

<r:RibbonApplicationMenu>
    <r:RibbonApplicationMenu.Resources>
        <Style TargetType="Popup">
            <Setter Property="Placement" Value="Left"/>
            <Setter Property="HorizontalOffset" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=r:RibbonApplicationMenu}, Path=Width, Converter={StaticResource ResourceKey=NegateIntegerConverter}}"/>
        </Style>
    </r:RibbonApplicationMenu.Resources>
</r:RibbonApplicationMenu>

コンバーターは、 で次のように定義さRibbonWindow.Resourcesれます。

<r:RibbonWindow.Resources>
    <local:NegateIntegerConverter x:Key="NegateIntegerConverter"/>
</r:RibbonWindow.Resources>

名前local空間は、次の内部で宣言する必要がありますRibbonWindow

<r:RibbonWindow x:Class="MainWindow"
    xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
    xmlns:local="clr-namespace:ApplicationRootNamespace"
>

最後に、 のコードはNegateIntegerConverter、アプリケーションのルート名前空間のクラスです。

Public Class NegateIntegerConverter
  Implements IValueConverter

  Public Function Convert(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
    Return -CInt(value)
  End Function

  Public Function ConvertBack(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
    Return -CInt(value)
  End Function
End Class

Class MainWindow

End Class

ここで、動作の違いについて説明します。画面がそこで終了しているためにメニューが右に完全に展開できない場合、ポップアップは単に少し左に開くのではなく、完全に左に開きます。「Windows 7 Paint」リボンのメニューのように実際にどのように動作しているかを知ることができるかもしれませんが、それまではこれが良い回避策です。

于 2013-01-03T12:32:29.090 に答える