【问题标题】:Create a contextmenu with tree structure in c#在 C# 中创建具有树结构的上下文菜单
【发布时间】:2011-11-12 05:49:02
【问题描述】:

我在尝试在 C# (WPF) 中创建具有层次结构的 ContextMenu 时遇到了困难。源代码是一个简单的列表,其中包含以下内容:

\\root\folderA\programA.exe
\\root\folderA\programB.exe
\\root\folderA\programC.exe
\\root\folderB\programA.exe
\\root\folderB\programE.exe
\\root\programF.exe
\\root\programG.exe
\\root\programH.exe

基本上我必须像这样创建一个菜单:

-root 
      -folderA 
               -programA.exe
               -programB.exe
               -programC.exe

我对 WPF 的经验很少,我知道这可以结合 ContextMenu 和 MenuItem 来完成。有什么提示吗?

【问题讨论】:

    标签: c# wpf contextmenu menuitem hierarchical


    【解决方案1】:

    我假设您正在为每个 TreeViewItem 制作视图模型?如果是这样,那么只需为每个视图模型类型分配不同的<HierarchicalDataTemplate> 资源,然后每个模板都可以拥有自己的<ContentMenu>。例如,这是我的一个项目,我正在制作一个像 TreeView 这样的 SQL 对象资源管理器:

            <TreeView.Resources>
                <!-- Brushes for the selected item -->
                <LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" EndPoint="0,1" StartPoint="0,0">
                    <GradientStop Color="#FFDCEBFC" Offset="0"/>
                    <GradientStop Color="#FFC1DBFC" Offset="1"/>
                </LinearGradientBrush>
                <LinearGradientBrush x:Key="{x:Static SystemColors.ControlBrushKey}" EndPoint="0,1" StartPoint="0,0">
                    <GradientStop Color="#FFF8F8F8" Offset="0"/>
                    <GradientStop Color="#FFE5E5E5" Offset="1"/>
                </LinearGradientBrush>
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
                <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
                <HierarchicalDataTemplate DataType="{x:Type vm:ServerViewModel}" ItemsSource="{Binding Children}">
                    <StackPanel Orientation="Horizontal" Margin="2,1,5,2">
                        <StackPanel.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Refresh">
                                    <MenuItem.Icon>
                                        <Image Source="/Content/ServerExplorer/RefreshIcon.png"></Image>
                                    </MenuItem.Icon>
                                </MenuItem>
                            </ContextMenu>
                        </StackPanel.ContextMenu>
                        <Grid Margin="0,0,3,0">
                            <Image Name="icon" Source="/Content/ServerExplorer/ServerIcon.png" Height="16" Width="16"></Image>
                        </Grid>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
    
                <HierarchicalDataTemplate DataType="{x:Type vm:DatabaseViewModel}" ItemsSource="{Binding Children}">
                    <StackPanel Orientation="Horizontal" Margin="2,1,5,2">
                        <StackPanel.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Refresh">
                                    <MenuItem.Icon>
                                        <Image Source="/Content/ServerExplorer/RefreshIcon.png"></Image>
                                    </MenuItem.Icon>
                                </MenuItem>
                            </ContextMenu>
                        </StackPanel.ContextMenu>
                        <Grid Margin="0,0,3,0">
                            <Image Name="icon" Source="/Content/ServerExplorer/DatabaseIcon.png" Height="16" Width="16"></Image>
                        </Grid>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
    
                <DataTemplate DataType="{x:Type vm:TableViewModel}">
                    <StackPanel Orientation="Horizontal" Margin="2,1,5,2">
                        <StackPanel.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Script Records" Click="ScriptRecords_Click">
                                    <MenuItem.Icon>
                                        <Image Source="/Content/ServerExplorer/ScriptIcon.png"></Image>
                                    </MenuItem.Icon>
                                </MenuItem>
                                <MenuItem Header="Script Table">
                                    <MenuItem.Icon>
                                        <Image Source="/Content/ServerExplorer/ScriptIcon.png"></Image>
                                    </MenuItem.Icon>
                                </MenuItem>
                                <MenuItem Header="Create Replication">
                                    <MenuItem.Icon>
                                        <Image Source="/Content/ServerExplorer/ReplicationIcon.png"></Image>
                                    </MenuItem.Icon>
                                </MenuItem>
                            </ContextMenu>
                        </StackPanel.ContextMenu>
                        <Grid Margin="0,0,3,0">
                            <Image Name="icon" Source="/Content/ServerExplorer/TableIcon.png" Height="16" Width="16"></Image>
                        </Grid>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>
    
                <DataTemplate DataType="{x:Type vm:StoredProcedureViewModel}">
                    <StackPanel Orientation="Horizontal" Margin="2,1,5,2">
                        <StackPanel.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Script Procedure">
                                    <MenuItem.Icon>
                                        <Image Source="/Content/ServerExplorer/ScriptIcon.png"></Image>
                                    </MenuItem.Icon>
                                </MenuItem>
                            </ContextMenu>
                        </StackPanel.ContextMenu>
                        <Grid Margin="0,0,3,0">
                            <Image Name="icon" Source="/Content/ServerExplorer/StoredProcedureIcon.png" Height="16" Width="16"></Image>
                        </Grid>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>
           </TreeView.Resources>
    

    我为每个 TreeViewItem 创建了不同的 ViewModel。在您的情况下,您可能会有一个 RootViewModel、FolderViewModel,然后是 FileViewModel。每个都有自己的模板,然后您可以根据需要设置每个模板。

    【讨论】:

    • 谢谢!但我忘了告诉我必须在运行时创建菜单。
    • 正确。您只需在运行时将 TreeView 与对象进行数据绑定。又名myTreeView.DataContext = myListViewModels;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多