【问题标题】:Convert WPF TreeView to Menu将 WPF TreeView 转换为菜单
【发布时间】:2011-04-14 10:29:45
【问题描述】:

我无法将此工作树视图转换为菜单。

此树视图显示正确。

<UserControl.DataContext>
    <ObjectDataProvider ObjectType="{x:Type storage:Database}"
                        MethodName="GetGroups"/>
</UserControl.DataContext>
<UserControl.Resources>
    <converters:PathToNameConverter x:Key="pathToNameConverter" />
</UserControl.Resources>
<TreeView Name="TreeViewMain" ItemsSource="{Binding Path=.}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type storage:File}">
            <TreeViewItem Header="{Binding Path=Name, Mode=TwoWay}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type storage:Group}">
            <TreeViewItem>
                <TreeViewItem.Header>
                    <StackPanel Grid.Row="0" Orientation="Horizontal">
                        <Image Source="../Images/Core/16x16/Folder.png" />
                        <TextBlock Text="{Binding Path=Name, Mode=TwoWay}"/>
                    </StackPanel>
                </TreeViewItem.Header>
                <ItemsControl ItemsSource="{Binding Path=Groups}" />
                <ItemsControl ItemsSource="{Binding Path=Files}" />
            </TreeViewItem>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

我将所有内容都更改为菜单,但它不起作用。有组名称和图像,箭头指向右侧,看起来它正在工作,但是当我点击它时它并没有展开。

<UserControl.DataContext>
    <ObjectDataProvider ObjectType="{x:Type storage:Database}"
                        MethodName="GetGroups"/>
</UserControl.DataContext>
<Menu Name="MenuMain" ItemsSource="{Binding Path=.}">
    <Menu.Resources>
        <HierarchicalDataTemplate DataType="{x:Type storage:File}">
            <MenuItem Header="{Binding Path=Name, Mode=TwoWay}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type storage:Group}">
            <MenuItem>
                <MenuItem.Header>
                    <StackPanel Grid.Row="0" Orientation="Horizontal">
                        <Image Source="../Images/Core/16x16/Folder.png" />
                        <TextBlock Text="{Binding Path=Name, Mode=TwoWay}" />
                    </StackPanel>
                </MenuItem.Header>
                <ItemsControl ItemsSource="{Binding Path=Groups}" />
                <ItemsControl ItemsSource="{Binding Path=Files}" />
            </MenuItem>
        </HierarchicalDataTemplate>
    </Menu.Resources>
</Menu>

我做错了什么?

【问题讨论】:

    标签: wpf menu treeview menuitem treeviewitem


    【解决方案1】:

    我并没有真正看你做错了什么,我会发布可以代替的代码。

    <Menu ItemsSource="{Binding Menus}" Name="menu" Height="20">        
        <Menu.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Items}" DataType="{x:Type plugin:MenuEntry}">
                <HierarchicalDataTemplate.ItemContainerStyle>
                    <Style TargetType="MenuItem">
                        <Setter Property="Command" Value="{Binding Command}" />
                        <Setter Property="Icon" Value="{Binding Icon}" />
                        <Setter Property="InputGestureText" Value="{Binding InputGestureText}" />
                        <Setter Property="IsCheckable" Value="{Binding IsCheckable}" />
                        <Setter Property="IsChecked" Value="{Binding IsChecked}" />
    
                        <!-- Handle separators -->
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Header}" Value="[Separator]">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate>
                                            <Separator />
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>                    
                </HierarchicalDataTemplate.ItemContainerStyle>
                <ContentControl Content="{Binding Header}"/>                
            </HierarchicalDataTemplate>
        </Menu.ItemTemplate>
    </Menu>
    

    菜单绑定到简单的对象集合,这些对象具有标题、图标等所有属性。它们还具有包含子项的 Items 属性。

    这并不完全是您要寻找的东西,但也许您能够解决它。我记得像你一样尝试过类似的方法,但我记得失败得很惨。 Menu 自己生成 MenuItem 对象(并且您正试图在其中添加另一个对象 - 您不能这样做,您必须只设置它的样式),这两个 ItemsControls 对我来说看起来有点奇怪(尽管我理解你需要它们)。

    【讨论】:

    • 感谢您的回答,它有效,但并不能真正解决我的问题。我找不到树视图到菜单的一对一转换;由于某种原因,我被引导相信存在。我用代码实现了我的菜单。干杯!
    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2014-09-18
    • 2021-10-05
    相关资源
    最近更新 更多