2012-04-05 38 views
0

在問這個問題之前,我花了很多時間瀏覽StackOverflow和Google,並且找不到任何非常有用的東西。我正在尋找關於如何從已編譯的Xaml文件加載菜單並將其附加到Menu控件的指南。我是WPF新手,請耐心等待。在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,但沒有更改。有什麼想法嗎?我確信我錯過了一些顯而易見的愚蠢,但是在搜索中我找不到任何有用的東西。

在此先感謝!

回答

0

這感覺就像100%查看我和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中拉出來,因爲它不需要那裏。

而不是將菜單放入您的XAML並綁定到MainMenu,而是直接在XAML中添加新的StartupShellMenu類。

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

如果該菜單隻存在於視圖中,請在視圖中保留所有菜單代碼100%。

+1

其實,我想我明白了。不過,謝謝大家的迴應。是的,我的計劃是有一組動態的菜單出現在上下文中,就像Visual Studio菜單的工作方式一樣。事實證明,你不能直接從一個菜單中將菜單項加載到另一個菜單項中,這實際上就是我正在做的。如果你仔細考慮它,這是有意義的,因爲所有權被稱爲質疑。我需要使用HierarchicalDataTemplate對象和ContentPresenter。 再次,謝謝。我會給你信貸的時間,你採取迴應。非常感謝。 – 2012-04-05 13:05:31