1

これはおそらくばかげた質問のように思えるかもしれませんが、私は WPF に非常に慣れていないので、ご容赦ください。悲しいことに、UI は私の主なスキル領域ではないため、WPF の概念を理解するのに苦労しています。

ツリー ビューを含むドック パネルを含むユーザー コントロールがあります。ツリー ビューは、うまく機能している階層データ テンプレートを使用してバインドされています。すべての項目とサブ コントロールがバインドされており、大まかな仕上がりに満足しています。レイアウト結果。ただし、最後にバインドされたツリー ビュー アイテムの下にボタンを追加したいと考えていました。

基本的に、これは私が達成しようとしているものです:ここに画像の説明を入力

現時点では、ツリービュー用とボタン用の2つの行を持つドックパネル内にグリッドがありますが、明らかにボタンはツリービューの一部ではありません。ツリーのスクロール領域内に配置したいビューの一部として表示され、最後の項目の後にのみ表示されます。

これが私の現在の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ワークフローデザイナーをリッピングしています. SPのものに。私はビジネス上の決定を下すのではなく、ただのコード モンキーです ;) .

どうもありがとう

ポール

4

2 に答える 2

3

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>
于 2011-05-06T09:20:23.723 に答える
2

を使用してCompositeCollection、元のコレクションをコードにバインドするのは少し難しいです。詳細については、この回答CollectionContainerで示した例を参照してください。上部にを置き、下部にTreeViewItemを含めButtonます。

于 2011-05-06T09:12:44.267 に答える