アクセラレータを使用して WPF でカスタム MenuHeaders を作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/59456

質問

WPF でカスタム MenuHeaders を作成して、(たとえば) メニュー項目にアイコンとテキストを含めることができるようにしたいと考えています。

通常、MenuItems を使用して、ヘッダー フィールドにストレート テキストを入力する場合、アンダースコアを使用してアクセラレータを追加できます。例: _ファイル

ただし、UserControl を追加したい場合、この関数は壊れると思います。次のようなことを行うにはどうすればよいでしょうか?

<Menu>
<MenuItem>
    <MenuItem.Header>
    <UserControl>
        <Image Source="..." />
        <Label Text="_Open" />
    </UserControl>
    </MenuItem.Header>
</MenuItem>
...
役に立ちましたか?

解決

Icon プロパティがニーズに合っていると思います。
ただし、元の質問に答えると、メニュー項目のコンテンツを作成するときにアクセラレータ機能を保持することができます。 MenuItem にネストされたコンテンツがある場合は、AccessText プロパティを明示的に定義する必要があります 以下の最初のもののように。インライン フォームを使用すると、これは自動的に処理されます。

 <Menu> 
   <MenuItem>
      <MenuItem.Header>
        <StackPanel Orientation="Horizontal">
          <Image Source="Images/Open.ico" />      
          <AccessText>_Open..</AccessText>
        </StackPanel>
      </MenuItem.Header>
    </MenuItem>
    <MenuItem Header="_Close" />
   </Menu>

他のヒント

問題は、MenuHeader のコンテンツ内に画像を配置したことです。これは、アクセラレータ キーを失うことを意味します。メニューヘッダーに画像を表示したいだけの場合は、次の手順を実行します。

<MenuItem Header="_Open">
  <MenuItem.Icon>
    <Image Source="images/Open.png"/>
  </MenuItem.Icon>
</MenuItem>

外観と操作性をさらにカスタマイズしたい場合は、 コントロールテンプレート メニューのスタイル。経験上、メニューとメニュー項目のスタイル設定は、他の WPF コントロールのスタイル設定よりもはるかに困難です。

最初に考えると、Icon プロパティには画像しか含めることができないと思われるでしょう。しかし、実際には何でも含めることができます。これは、プログラムで Image プロパティを画像へのパスを含む文字列に直接設定しようとしたときに偶然発見しました。その結果、画像は表示されず、パスの実際のテキストが表示されました。次に、最初に Image 要素を作成し、それを Icon プロパティに設定する必要があることがわかりました。このため、Image プロパティはメニューの左側のアイコン領域にあるコンテンツ コンテナーであると考えましたが、それは正しかったです。そこでボタンを押してみたところ、うまくいきました!

これは、メニュー項目のアイコン領域にテキスト「i」が付いたボタンを表示しています。ボタンをクリックすると、Button_Click イベントがトリガーされます (ボタンをクリックしても、LanguageMenu_Click はトリガーされません)。

<MenuItem Name="LanguageMenu" Header="_Language" Click="LanguageMenu_Click">
  <MenuItem.Icon>
    <Button Click="Button_Click">i</Button>
  </MenuItem.Icon>
</MenuItem>

これにより、アイコン用の画像を作成する必要がなく、代わりにシンボル フォントを使用したテキストを使用して単純な「アイコン」を表示するという代替案が得られます。次の例では、フロッピーディスク シンボルを含む Wingdings フォントを使用しています。フォント内のこの記号は文字にマッピングされます <, これは XAML で特別な意味を持っているため、エンコードされたバージョンを使用する必要があります &lt; その代わり。これは夢のように機能します!以下は、メニュー項目上のアイコンとしてフロッピーディスクのシンボルを示しています。

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" 
           FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>                
</MenuItem>

@a7an:ああ、Icon プロパティに今まで気づきませんでした。良いスタートですね。

ただし、具体的には、いくつかの MenuItem に追加の「ボタン」を追加して、「ピン」機能を持たせたいと考えていました (機能のアイデアについては、Office 2007 に最近読み込まれたドキュメント リストを参照してください)。

コードも必要なので、コントロールをサブクラス化し、ボタンのコードを追加する必要があるでしょうか?(MenuItem テンプレートをいじるのは恐れません。すでに一度実行する必要があり、必要に応じてもう一度実行します。;))

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top