2

在这里使用了为 TreeViewItems 设置全行选择的方法: Lee Campbell Horizo​​ntal stretch for treeviewitems

这适用于顶级项目。

但是TreeViewItem.Items 集合好像有问题,好像没有取到正确的模板。(我看到它不在TreeView.Items集合中,如模板所示)

有没有一种简单的方法可以从父项样式派生子项样式?

我怎样才能描述一次样式(对于所有 TreeviewItems)并让样式用于所有 TreeViewItems,无论它们是在集合中TreeView.Items还是在TreeViewItem.Items集合中?

这是我的 XAML,一些代码来自 LeeCampbell 示例。

<Window x:Class="TreeViewFullRow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TreeViewFullRow"
        Title="MainWindow"
        Width="525"
        Height="350">

    <Window.Resources />

    <Grid>

        <TreeView Name="TreeData"
                  Width="236"
                  Height="311"
                  HorizontalAlignment="Left"
                  VerticalAlignment="Top">

            <TreeView.ItemContainerStyle>




                <Style BasedOn="{StaticResource {x:Type TreeViewItem}}" TargetType="TreeViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Center" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="TreeViewItem">
                                <StackPanel>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto" MinWidth="19" />
                                            <ColumnDefinition Width="*" />
                                        </Grid.ColumnDefinitions>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto" />
                                            <RowDefinition />
                                        </Grid.RowDefinitions>
                                        <!--
                                            Note that the following do not work, but I believe the top 2 should?!
                                            <ToggleButton IsChecked="{TemplateBinding IsExpanded}" ClickMode="Press" Name="Expander">
                                            <ToggleButton IsChecked="{TemplateBinding Property=IsExpanded}" ClickMode="Press" Name="Expander">
                                            <ToggleButton IsChecked="{TemplateBinding Path=IsExpanded}" ClickMode="Press" Name="Expander">
                                        -->
                                        <ToggleButton Name="Expander"
                                                      ClickMode="Press"
                                                      IsChecked="{Binding Path=IsExpanded,
                                                                          RelativeSource={RelativeSource TemplatedParent}}">
                                            <ToggleButton.Style>
                                                <Style TargetType="ToggleButton">
                                                    <Setter Property="UIElement.Focusable" Value="false" />
                                                    <Setter Property="FrameworkElement.Width" Value="16" />
                                                    <Setter Property="FrameworkElement.Height" Value="16" />
                                                    <Setter Property="Control.Template">
                                                        <Setter.Value>
                                                            <ControlTemplate TargetType="ToggleButton">
                                                                <Border Width="16"
                                                                        Height="16"
                                                                        Background="#00FFFFFF"
                                                                        Padding="5,5,5,5">
                                                                    <Path Name="ExpandPath"
                                                                          Fill="#00FFFFFF"
                                                                          Stroke="#FF989898">
                                                                        <Path.Data>
                                                                            <PathGeometry Figures="M0,0L0,6L6,0z" />
                                                                        </Path.Data>
                                                                        <Path.RenderTransform>
                                                                            <RotateTransform Angle="135" CenterX="3" CenterY="3" />
                                                                        </Path.RenderTransform>
                                                                    </Path>
                                                                </Border>
                                                                <ControlTemplate.Triggers>
                                                                    <Trigger Property="UIElement.IsMouseOver" Value="True">
                                                                        <Setter TargetName="ExpandPath" Property="Shape.Stroke" Value="#FF1BBBFA" />
                                                                        <Setter TargetName="ExpandPath" Property="Shape.Fill" Value="#00FFFFFF" />
                                                                    </Trigger>
                                                                    <Trigger Property="ToggleButton.IsChecked" Value="True">
                                                                        <Setter TargetName="ExpandPath" Property="UIElement.RenderTransform">
                                                                            <Setter.Value>
                                                                                <RotateTransform Angle="180" CenterX="3" CenterY="3" />
                                                                            </Setter.Value>
                                                                        </Setter>
                                                                        <Setter TargetName="ExpandPath" Property="Shape.Fill" Value="#FF595959" />
                                                                        <Setter TargetName="ExpandPath" Property="Shape.Stroke" Value="#FF262626" />
                                                                    </Trigger>
                                                                </ControlTemplate.Triggers>
                                                            </ControlTemplate>
                                                        </Setter.Value>
                                                    </Setter>
                                                </Style>
                                            </ToggleButton.Style>
                                        </ToggleButton>
                                        <Border x:Name="Bd"
                                                Grid.Column="1"
                                                HorizontalAlignment="Stretch"
                                                Background="{TemplateBinding Panel.Background}"
                                                BorderBrush="{TemplateBinding Border.BorderBrush}"
                                                BorderThickness="{TemplateBinding Border.BorderThickness}"
                                                Padding="{TemplateBinding Control.Padding}"
                                                SnapsToDevicePixels="True">
                                            <ContentPresenter x:Name="PART_Header"
                                                              HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                                                              Content="{TemplateBinding HeaderedContentControl.Header}"
                                                              ContentSource="Header"
                                                              ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}"
                                                              ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
                                                              ContentTemplateSelector="{TemplateBinding HeaderedItemsControl.HeaderTemplateSelector}"
                                                              SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                                        </Border>
                                        <ItemsPresenter x:Name="ItemsHost"
                                                        Grid.Row="1"
                                                        Grid.Column="1" />
                                    </Grid>
                                </StackPanel>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="TreeViewItem.IsExpanded" Value="False">
                                        <Setter TargetName="ItemsHost" Property="UIElement.Visibility" Value="Collapsed" />
                                    </Trigger>
                                    <Trigger Property="ItemsControl.HasItems" Value="False">
                                        <Setter TargetName="Expander" Property="UIElement.Visibility" Value="Hidden" />
                                    </Trigger>
                                    <Trigger Property="TreeViewItem.IsSelected" Value="True">
                                        <Setter TargetName="Bd" Property="Panel.Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
                                        <Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" />
                                    </Trigger>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="TreeViewItem.IsSelected" Value="True" />
                                            <Condition Property="Selector.IsSelectionActive" Value="False" />
                                        </MultiTrigger.Conditions>
                                        <Setter TargetName="Bd" Property="Panel.Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
                                        <Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
                                    </MultiTrigger>
                                    <Trigger Property="UIElement.IsEnabled" Value="False">
                                        <Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>




            </TreeView.ItemContainerStyle>

        </TreeView>


        <Button Name="BtnLoad"
                Width="75"
                Height="23"
                Margin="277,12,0,0"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Click="OnBtnLoad"
                Content="Load data" />
    </Grid>
</Window>

这很容易。在按钮单击处理程序中,我将新项目添加到 TreeView。这是代码:

private void OnBtnLoad(object sender, RoutedEventArgs e)
{
    var count = this.TreeData.Items.Count.ToString();
    var parent = new TreeViewItem() { Name = "Name_" + count, Header = "Header_" + count };

    this.TreeData.Items.Add(parent);

    var child0 = new TreeViewItem() { Name = "Name_" + count + "_0", Header = "Header_" + count + "_0" };
    var child1 = new TreeViewItem() { Name = "Name_" + count + "_1", Header = "Header_" + count + "_1" };
    var child2 = new TreeViewItem() { Name = "Name_" + count + "_2", Header = "Header_" + count + "_2" };

    parent.Items.Add(child0);
    parent.Items.Add(child1);
    parent.Items.Add(child2);

    parent.Items.Refresh();
}
4

1 回答 1

4

如果您将样式放在视觉树的更上方,它将影响树视图中的项目和子项目。例如,您可以将样式放入Grid.Resources或放入,Window.Resources而不是TreeView.ItemContainerStyle像现在那样将其放入。

于 2013-01-31T12:04:15.337 回答