none
Treeview中contextmenu的问题 RRS feed

  • 问题

  • 我有一个treeview,里面的数据是动态绑定了的,用了HierarchicalDataTemplate和DataTemplate。

    然后我想要给它添加右键弹出菜单,我的需求是这样子的:

    1. 在标题上和在展开后的内容上右击出现的contextmenu不同。

    如:

    +音乐

    - 影视

        欧美

        港台

    在“音乐”、“影视”上的ContextMenu与“欧美”、“港台”上的不同。

    这个应该要从后台代码上动态设置每个TreeViewMenu,但我不知道从哪里判断某个TreeViewMenu是一级还是二级的。。

    2. “音乐”的二级menu中的ContextMenu与“影视”中的二级menu又不一样。这个问题跟上面的差不多,主要是动态设置ContextMenu的问题,但我不知道从哪入手。。。

    3. 只有在某个TreeView处于selected状态的时候,才允许ContextMenu弹出

    版主帮忙给点思路 (~ o ~)

    哦,对了,我的环境是.net4.0,vs2010

    2011年6月20日 11:28

答案

  • 你好,

    如果音乐,影视是不同类型的,是可以直接通过HierarchicalDataTemplate的ItemContainerStyle来实现。

    如果是同一个类型的,那你可以考虑在ItemContainerStyle中加一个Trigger来实现。例如,

        <HierarchicalDataTemplate DataType= "{x:Type src:FriendList}"
      ItemsSource = "{Binding Path=Friends}">
          <Label Content="{Binding Path=ListName}"/>
          <HierarchicalDataTemplate.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
              <Style.Triggers>
                <DataTrigger Binding="{Binding 媒体类别}" Value="影视">
                  <Setter Property="ContextMenu" Value="{StaticResource 影视Item的右键菜单}"></Setter>
                </DataTrigger>
              </Style.Triggers>
            </Style>
          </HierarchicalDataTemplate.ItemContainerStyle>
        </HierarchicalDataTemplate>
    

    对于新的问题,能开一个新帖吗?我们鼓励在论坛上每个帖子只集中讨论一个问题。这样便于问题的谈论,也可以方便其他论坛成员搜索到问题和答案。

    谢谢!


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Behindmoon 2011年6月24日 9:57
    2011年6月24日 8:55
    版主

全部回复

  • 你好,

    我觉得可以通过TreeView的ItemContainerStyle和HierarchicalDataTemplate的ItemContainerStyle来给一级TreeViewItem和各类二级TreeViewItem设置不同的ContextMenu.

    对于第3点,可以通过处理ContextMenuOpening事件来决定是否是取消ContextMenu的打开。

     


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月22日 3:05
    版主
  • 你好,感谢回复

    用你的方法是可以给一级和二级TreeViewItem设置不同的ContextMenu。但我要给同一级的TreeViewItem设置不同的ContextMenu就不行了。因为数据是动态绑定的,估计得用c#代码进行同级TreeViewItem不同ContextMenu的设置。但具体该怎么做还是不太清楚,请再提点一下。

    另外,TreeView中默认的选中操作是通过单击鼠标进行选中,我想通过鼠标移动上去就使其处于选中状态。然后我的代码是这样的:

    <Window.Resources>
    
        <ContextMenu x:Key="item">
          <MenuItem Header="itemDelete" Click="Level2_Click"></MenuItem>
        </ContextMenu>
    
        <ContextMenu x:Key="list">
          <MenuItem Header="level1 delete" Click="Level1_Click"></MenuItem>
        </ContextMenu>
        
        <HierarchicalDataTemplate DataType= "{x:Type src:FriendList}"
        ItemsSource = "{Binding Path=Friends}">
          <Label Content="{Binding Path=ListName}"/>
          <HierarchicalDataTemplate.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
              <Setter Property="ContextMenu" Value="{StaticResource item}">
              </Setter>
              <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                  <Setter Property="IsSelected" Value="True"></Setter>
                </Trigger>
              </Style.Triggers>
            </Style>
          </HierarchicalDataTemplate.ItemContainerStyle>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type src:Member}">
          <Label Name="label" Content="{Binding Path=Account}" MouseDoubleClick="label_MouseDoubleClick"/>
        </DataTemplate>
    
      </Window.Resources>
      <StackPanel>
        <TreeView Height="100">
          <TreeView.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
              <Setter Property="ContextMenu" Value="{StaticResource list}">
              </Setter>
              <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                  <Setter Property="IsSelected" Value="True"></Setter>
                </Trigger>
              </Style.Triggers>
            </Style>
          </TreeView.ItemContainerStyle>
        </TreeView>
        
      </StackPanel>
    
    可以跟我预期的一样运行,但就是有时候会出现一个问题,当我展开第二个菜单的时候,鼠标在二级菜单上晃荡,二级菜单会正确地随着鼠标的位置而处于被选中状态,当我的鼠标从二级菜单移到一级菜单上时,就失效了,一级菜单无法处于被选中状态。


    2011年6月23日 2:49
  • 你好,

    如果音乐,影视是不同类型的,是可以直接通过HierarchicalDataTemplate的ItemContainerStyle来实现。

    如果是同一个类型的,那你可以考虑在ItemContainerStyle中加一个Trigger来实现。例如,

        <HierarchicalDataTemplate DataType= "{x:Type src:FriendList}"
      ItemsSource = "{Binding Path=Friends}">
          <Label Content="{Binding Path=ListName}"/>
          <HierarchicalDataTemplate.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
              <Style.Triggers>
                <DataTrigger Binding="{Binding 媒体类别}" Value="影视">
                  <Setter Property="ContextMenu" Value="{StaticResource 影视Item的右键菜单}"></Setter>
                </DataTrigger>
              </Style.Triggers>
            </Style>
          </HierarchicalDataTemplate.ItemContainerStyle>
        </HierarchicalDataTemplate>
    

    对于新的问题,能开一个新帖吗?我们鼓励在论坛上每个帖子只集中讨论一个问题。这样便于问题的谈论,也可以方便其他论坛成员搜索到问题和答案。

    谢谢!


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Behindmoon 2011年6月24日 9:57
    2011年6月24日 8:55
    版主
  • 谢谢,你提供的方案可以解决问题!
    2011年6月24日 9:57