Конвертировать WPF TreeView в меню - PullRequest
1 голос
/ 14 апреля 2011

У меня проблемы с преобразованием этого рабочего дерева в меню.

Это дерево отображается правильно.

<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>

Что я делаю не так?

1 Ответ

1 голос
/ 14 апреля 2011

Я действительно не посмотрел, что вы сделали неправильно, я опубликую код, который работает вместо этого.

<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 сам по себе (и вы пытаетесь добавить в него еще один - вы не должны этого делать, вам нужно только стилизовать его вместо этого), также эти два элемента управления элементов выглядят немного странно для меня (хотя я понимаю,они вам нужны).

...