4

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

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

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

<Menu>
<MenuItem>
    <MenuItem.Header>
    <UserControl>
        <Image Source="..." />
        <Label Text="_Open" />
    </UserControl>
    </MenuItem.Header>
</MenuItem>
...
4

4 に答える 4

7

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>
于 2008-09-13T06:34:48.413 に答える
4

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

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

ルック アンド フィールをさらにカスタマイズする場合は、メニューのコントロール テンプレートとスタイルを変更します。経験上、メニューとメニュー項目のスタイリングは、他の WPF コントロールのスタイリングよりもはるかに困難です。

于 2008-09-12T18:30:17.453 に答える
2

最初に考えたのは、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 で特別な意味を持つcharachter にマップされるため、&lt;代わりにエンコードされたバージョンを使用する必要があります。これは夢のように機能します!以下は、フロッピーディスクのシンボルをメニュー項目のアイコンとして示しています。

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" 
           FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>                
</MenuItem>
于 2009-07-10T09:26:27.567 に答える
0

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

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

コードも必要なので、おそらくコントロールをサブクラス化し、ボタンのコードを追加する必要がありますか? (MenuItem テンプレートをいじることを恐れないでください。すでに一度やらなければならなかったので、必要に応じてもう一度やり直します! ;))

于 2008-09-13T06:15:43.247 に答える