如何强制加载上下文菜单?

时间:2016-03-09 15:01:16

标签: c# wpf treeview contextmenu treeviewitem

我有一个包含TreeView的wpf应用程序。 TreeView有一个上下文菜单。 右键单击其中一个TreeViewItem后,上下文菜单才开始加载。 (我怎么知道这一点 - 我在上下文菜单的加载事件中添加了一个日志。一旦我点击其中一个TreeViewItems,它就会编写日志消息。 这导致的问题是,似乎上下文菜单在第一次单击时不起作用。实际上负载只是第一次需要时间。) 由于加载需要一两分钟,我希望它在应用程序启动后立即开始加载。 上下文菜单没有“加载”操作。任何想法如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

为您的context menu创建一个样式,如下所示

 <ContextMenu ItemsSource="{Binding ContextActions}">                    
     <ContextMenu.ItemContainerStyle>
          <Style TargetType="{x:Type MenuItem}" >
                <Setter Property="Header" Value="{Binding Title}"/>
                <Setter Property="ToolTip" Value="{Binding ToolTips}"/>
                <Setter Property="Command" Value="{Binding ContextCommand}"/>
                <Setter Property="Icon" Value="{StaticResource Icon}"/>
                <Setter Property="CommandParameter" Value="{Binding CommandParameter}"/>
           </Style>
     </ContextMenu.ItemContainerStyle>
 </ContextMenu>

根据您context menu所选的项目更改ItemsSource tree view

答案 1 :(得分:0)

上下文菜单项被绑定到数据上下文中的内部属性(例如,如果我有一个名为Manager的属性,并且它有一个名为MenuItems的属性,则它被绑定到Manager.MenuItems)。 inner属性只有一个get属性,在调用它时,它会计算可观察的菜单项集合。 那么我做了什么来解决我的问题我签署了TreeView的Loaded事件,然后我跑遍了所有第一层次的TreeViewItems,对于我做的每一个:

    item.IsSelected = true;
    item.Focus();
    item.IsOpen = true;
    var items = Manager.MenuItems; // Calculates the menu items (it's per item in my code so it doesn't look exactly the same

第四行是在加载前计算菜单项。 最后两行必须放在一起,由于某种原因,如果不存在,它就不起作用。 希望这有助于某人