none
如何设计内容变动的ContextMenu? RRS feed

  • 问题

  • 我有一个TreeView,在TreeViewItem 设置了ContextMenu

     <TreeView Name="treeViewAp">
    
    
      <TreeViewItem Header="A">
    
    
    
      <TreeViewItem Header="1" Foreground="White" />
    
    
    
      <TreeViewItem Header="2" Foreground="White" />
    
    
    
      </TreeViewItem>
    
    
    
      <TreeViewItem Header="B" >
    
    
    
      <TreeViewItem Header="3" Foreground="White" />
    
    
    
      <TreeViewItem Header="4" Foreground="White" />
    
    
    
      </TreeViewItem>
    
    
    
      <TreeViewItem Header="C">
    
    
    
      <TreeViewItem Header="5" Foreground="White" />
    
    
    
      <TreeViewItem Header="6" Foreground="White" />
    
    
    
      </TreeViewItem>
    
    
    
    
    
    
    
     </TreeView>
    
    
    
    

    我希望能把Header=1的item转移到C,这时ContextMenu就会显示转移到B或C,但是TreeView的Item是不固定的,用户可以随意新增TreeViewItem和修改TreeViewItem的Header。

    这样就导致我的ContextMenu里的Item也要随着TreeViewItem数量减一变动,而且Header也要随着TreeViewItem变动。更重要的是每个TreeViewItem都拥有这个ContextMenu。。     请问这个ContextMenu如何设计?



    2011年5月12日 8:19

答案

  • 前面的代码仅仅只能提供一个思路,在细节方面需要根据你的具体需要进行调整。

    要做到点击A时不出现A,可以通过ContextMenu的ItemContainerStyle把MenuItem的IsVisible属性多重绑定到SelectedItem和Items上进行判断。


    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.

    • 已标记为答案 MaJiXiang 2011年5月17日 8:10
    2011年5月17日 1:21
    版主

全部回复

  • 你好,

    我写了个简单的小例子,希望能提供一些思路。

        <TreeView Name="treeViewAp" Tag="TV">
          <TreeView.ContextMenu>
            <ContextMenu ItemsSource="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.Items}">
              <ContextMenu.ItemTemplate>
                <DataTemplate>
                  <TextBlock>转移到<TextBlock Text="{Binding Header}"/></TextBlock>
                </DataTemplate>
              </ContextMenu.ItemTemplate>
              <ContextMenu.ItemContainerStyle>
                <Style TargetType="MenuItem">
                  <EventSetter Event="Click" Handler="MenuItem_Click"/>
                  <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}"/>
                </Style>
              </ContextMenu.ItemContainerStyle>
            </ContextMenu>
          </TreeView.ContextMenu>
          <TreeViewItem Header="A" Tag="A">
            <TreeViewItem Header="1" Foreground="White" Tag="1"/>
            <TreeViewItem Header="2" Foreground="White" />
          </TreeViewItem>
          <TreeViewItem Header="B" >
            <TreeViewItem Header="3" Foreground="White" />
            <TreeViewItem Header="4" Foreground="White" />
          </TreeViewItem>
          <TreeViewItem Header="C">
            <TreeViewItem Header="5" Foreground="White" />
            <TreeViewItem Header="6" Foreground="White" />
          </TreeViewItem>
        </TreeView>
    

     

        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
          MenuItem menuItem = (MenuItem)sender;
          TreeViewItem selectedItem = menuItem.Tag as TreeViewItem;
          if (selectedItem != null)
          {
            TreeViewItem targetItem = menuItem.DataContext as TreeViewItem;
            ItemsControl originalParent = ItemsControl.ItemsControlFromItemContainer(selectedItem);
            if (targetItem !=null && originalParent !=null )
            {
              originalParent.Items.Remove(selectedItem);
              targetItem.Items.Add(selectedItem);
            }
          }
        }
    


    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年5月16日 6:31
    版主
  • 右键菜单内容不能固定,当点击A时效果是转移至B或C,就不能在出现A了。
    2011年5月16日 11:32
  • 前面的代码仅仅只能提供一个思路,在细节方面需要根据你的具体需要进行调整。

    要做到点击A时不出现A,可以通过ContextMenu的ItemContainerStyle把MenuItem的IsVisible属性多重绑定到SelectedItem和Items上进行判断。


    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.

    • 已标记为答案 MaJiXiang 2011年5月17日 8:10
    2011年5月17日 1:21
    版主