Кнопка добавления WPF в нижнюю часть дерева - PullRequest
1 голос
/ 06 мая 2011

это, вероятно, покажется глупым вопросом, но, пожалуйста, потерпите меня, поскольку я очень плохо знаком с WPF, пользовательский интерфейс, к сожалению, не является моей основной областью навыков, и поэтому я изо всех сил пытаюсь разобраться с концепциями WPF .

У меня есть пользовательский элемент управления, который содержит панель закрепления, которая затем содержит древовидное представление, древовидное представление связывается с использованием Иерархического шаблона данных, который прекрасно работает, все элементы и вспомогательные элементы управления связаны, и я рад с грубым результатом макета. Однако я хотел добавить кнопку под последним связанным элементом представления дерева.

В основном это то, что я пытаюсь достичь: enter image description here

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

Вот мой текущий XAML:

<DockPanel>
    <Grid Width="Auto" Height="Auto">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="23"/>
        </Grid.RowDefinitions>
    <TreeView ItemsSource="{Binding Path=Steps}" FontFamily="Calibri" FontSize="14" DataContext="{Binding}" Grid.Row="0">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
                <Setter Property="FontWeight" Value="Normal"/>
                <Setter Property="Margin" Value="20,20,0,0"/>
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type local:StepViewModel}" ItemsSource="{Binding Segments}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type local:SegmentViewModel}">
                <DockPanel HorizontalAlignment="Stretch" >
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
                        <myUserControl:SegmentLayout HorizontalAlignment="Stretch"/>
                        <TextBlock Text="{Binding Value}"/>
                    </StackPanel>
                </DockPanel>
            </DataTemplate>
        </TreeView.Resources>
        </TreeView>
        <Button HorizontalAlignment="Left" Content="Add Step" Name="addStepButton" Height="23" Width="103" Grid.Row="1"/>
    </Grid>

Да, и прежде чем вы спросите, да, я в основном разрываю конструктор рабочих процессов SharePoint, это для внутреннего инструмента, и по какой-то причине мне нужно написать облегченный движок рабочих процессов, который уже готов, и конструктор для него в WPF, который выглядит очень похоже на SP. Я не принимаю бизнес-решений, просто обезьяна кода;).

Большое спасибо

Пол

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Вы можете извлечь шаблон по умолчанию для TreeView и изменить его.Извлечение легко сделать в VS2010 или Blend.Я извлек его и добавил кнопку внизу.Я также добавил StackPanel, в которой он находится.

<Window x:Class="WpfApplication7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ControlTemplate x:Key="Template1"
                         TargetType="TreeView">
            <Border BorderBrush="{TemplateBinding Control.BorderBrush}"
                    BorderThickness="{TemplateBinding Control.BorderThickness}"
                    Name="Bd"
                    SnapsToDevicePixels="True">
                <ScrollViewer Background="{TemplateBinding Control.Background}"
                              CanContentScroll="False"
                              Focusable="False"
                              HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
                              Name="_tv_scrollviewer_"
                              Padding="{TemplateBinding Control.Padding}"
                              SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"
                              VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}">
                    <StackPanel FlowDirection="LeftToRight">
                        <ItemsPresenter />
                        <Button>My button</Button>
                    </StackPanel>

                </ScrollViewer>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="UIElement.IsEnabled"
                         Value="False">
                    <Setter Property="Border.Background"
                            TargetName="Bd"
                            Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
                </Trigger>
                <Trigger Property="VirtualizingStackPanel.IsVirtualizing"
                         Value="True">
                    <Setter Property="ScrollViewer.CanContentScroll"
                            TargetName="_tv_scrollviewer_"
                            Value="True" />
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Window.Resources>
    <Grid>
        <TreeView Template="{StaticResource Template1}">
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
            <TreeViewItem>fgbhbgfdshgsfde</TreeViewItem>
        </TreeView>
    </Grid>
</Window>
2 голосов
/ 06 мая 2011

Используйте CompositeCollection, связать исходную коллекцию в коде немного сложно, посмотрите пример, который я привожу в этот ответ , для более подробной информации, просто введите CollectionContainer сверху и TreeViewItem, включая Button снизу.

...