0

この質問をする前に、StackOverflow と Google を調べるのにかなりの時間を費やしましたが、非常に役立つものは見つかりませんでした。コンパイルされた Xaml ファイルからメニューをロードし、それをメニュー コントロールにアタッチする方法に関するガイドラインを探しています。私はWPFの初心者なので、ご容赦ください。

私のページには、次の Xaml があります。

<Menu ItemsSource="{Binding MainMenu}">
</Menu>

私のビューモデルクラスは現在次のようになっています:

public class MainWindowViewModel : ViewModelBase
{
    public ItemCollection MainMenu { get; set; }

    public MainWindowViewModel()
    {
        Menu m = (Menu)Application.LoadComponent(new Uri("/Assets/Menus/StartupShellMenu.xaml", UriKind.Relative));
        MainMenu = m.Items;
    }
}

StartupShellMenu.xaml ファイルは次のようになります。

<Menu xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <MenuItem Header="_File">
        <MenuItem Header="_Open">
            <MenuItem.Icon>
                <Image Height="16" Width="16" Source="/Assets/Icons/Open.png"/>
            </MenuItem.Icon>
        </MenuItem>
        <Separator/>
        <MenuItem Header="E_xit"/>
    </MenuItem>
</Menu>

メニュー項目は表示されますが、マウスがメニューから離れると (クリックする必要はありません)、メニューが消えます。また、通常のキーボード機能が機能していません。Alt+F を押してもメニューは表示されず、一度表示されると上下キーは機能しません。MainMenu プロパティのタイプを ObservableCollection に変更しようとしましたが、変更はありません。何かご意見は?ばかげた明らかな何かが欠けていると確信していますが、検索で役立つものは何も見つかりません。

前もって感謝します!

4

1 に答える 1

0

これは私には100%Viewのように感じられ、ViewModelは関与すべきではないかもしれません。

なぜこれにViewModelを使用しているのですか?動的メニューになるように、実行時にメニューを変更できるようにしていますか?

そうでない場合は、StartupShellMenu.xamlファイルのクラスにクラス名を付けてからロードします。

<Menu x:Class="StartupShellMenu"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <MenuItem Header="_File">
        <MenuItem Header="_Open">
            <MenuItem.Icon>
                <Image Height="16" Width="16" Source="/Assets/Icons/Open.png"/>
            </MenuItem.Icon>
        </MenuItem>
        <Separator/>
        <MenuItem Header="E_xit"/>
    </MenuItem>
</Menu>

次に、ViewModelで必要ないため、ViewModelからプルします。

また、メニューをXAMLに配置してMainMenuにバインドする代わりに、新しいStartupShellMenuクラスをXAMLに直接追加するだけです。

<local:StartupShellMenu ItemsSource="{Binding MainMenu}" />

メニューがビューにのみ存在する場合は、すべてのメニューコードをビューに100%保持します。

于 2012-04-05T04:40:44.417 に答える