【问题标题】:HorizontalAlignment="Stretch" not working in TreeViewItemHorizo​​ntalAlignment="Stretch" 在 TreeViewItem 中不起作用
【发布时间】:2016-02-22 15:05:18
【问题描述】:

这是一个不工作的例子:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <TreeView HorizontalAlignment="Stretch">
        <TreeViewItem Header="Stuff" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
            <Grid HorizontalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0">Some random text</Label>
                <TextBox Grid.Column="1"></TextBox>

            </Grid>
        </TreeViewItem>
    </TreeView>
</Window>

我希望文本框拉伸到窗口的宽度,但你得到了这个:

文本框在您键入时扩展,这不是我想要的。

我现在在想,可以将第二列的宽度绑定到TreeViewItem 的宽度,但我不知道该怎么做。

我尝试将网格放在各种面板中,但这也不起作用。我还在文本框本身上将HorizontalAlignmentHorizontalContentAlignment 设置为Stretch,但这也不起作用。

这是Grid 控件的一些限制吗?将文本框单独放在树视图中会使其按我想要的方式展开,但我需要将标签放在它旁边,如果有多个字段,如果所有文本框都对齐,它看起来会更好。

更新

使用不同的ControlTemplate 允许标题拉伸,但内容仍然不拉伸。

<TreeView HorizontalAlignment="Stretch">
        <TreeViewItem Style="{DynamicResource StretchableTreeViewItemTemplate}" HorizontalAlignment="Stretch" Header="Stuff">
            <Grid HorizontalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0">Some random text</Label>
                <TextBox Grid.Column="1" HorizontalAlignment="Stretch"></TextBox>
            </Grid>
        </TreeViewItem>
    </TreeView>



<Style x:Key="StretchableTreeViewItemTemplate" TargetType="TreeViewItem"
   BasedOn="{StaticResource {x:Type 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 IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
                      ClickMode="Press"
                      Name="Expander">
                                <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 Padding="5,5,5,5"
                            Background="#00FFFFFF"
                            Width="16"
                            Height="16">
                                                        <Path Fill="#00FFFFFF"
                            Stroke="#FF989898"
                            Name="ExpandPath">
                                                            <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"
                HorizontalAlignment="Stretch"
                BorderThickness="{TemplateBinding Border.BorderThickness}"
                BorderBrush="{TemplateBinding Border.BorderBrush}"
                Padding="{TemplateBinding Control.Padding}"
                Background="{TemplateBinding Panel.Background}"
                SnapsToDevicePixels="True"
                Grid.Column="1">
                                <ContentPresenter x:Name="PART_Header"
                            Content="{TemplateBinding HeaderedContentControl.Header}"
                            ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
                            ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}"
                            ContentTemplateSelector="{TemplateBinding HeaderedItemsControl.HeaderTemplateSelector}"
                            ContentSource="Header"
                            HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                            SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                            </Border>
                            <ItemsPresenter x:Name="ItemsHost"
                        Grid.Column="1"
                        Grid.Row="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>

结果:

尝试 Pikoh 的解决方案:

<local:StretchingTreeView HorizontalAlignment="Stretch">
    <local:StretchingTreeViewItem HorizontalAlignment="Stretch" Header="Stuff">
        <Grid HorizontalAlignment="Stretch">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Label Grid.Column="0">Some random text</Label>
            <TextBox Grid.Column="1" HorizontalAlignment="Stretch"></TextBox>
        </Grid>
    </local:StretchingTreeViewItem>
</local:StretchingTreeView>

【问题讨论】:

  • 适合我吗?您还必须设置一些其他属性。你确定你给出了正确的代码吗?
  • 如果您能告诉我在哪里可以找到类似的任何额外属性,我会非常乐意检查,但这是我所拥有的尽可能多的代码。我也没有接触文件背后的代码,我只是在 VS2015 中创建了一个新项目并将其放入其中。如果这很重要,我正在使用 .NET 4.5。
  • 查看我的答案或@BradleyUffner 的答案,我认为它们都可以工作
  • 好吧,在我使用答案中提供的继承类完成的示例项目中,它伸展得很好,文本框展开了......

标签: c# .net wpf xaml


【解决方案1】:

试试这样的:

<TextBox Grid.Column="1" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Grid}}, Mode=OneWay}"></TextBox>

编辑

好的,我找到了一种解决方案Here。它基本上创建了一个继承 Treeview 的新类:

class StretchingTreeView : TreeView
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new StretchingTreeViewItem();
    }

    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return item is StretchingTreeViewItem;
    }
}

class StretchingTreeViewItem : TreeViewItem
{
    public StretchingTreeViewItem()
    {
        this.Loaded += new RoutedEventHandler(StretchingTreeViewItem_Loaded);
    }

    private void StretchingTreeViewItem_Loaded(object sender, RoutedEventArgs e)
    {
        // The purpose of this code is to stretch the Header Content all the way accross the TreeView. 
        if (this.VisualChildrenCount > 0)
        {
            Grid grid = this.GetVisualChild(0) as Grid;
            if (grid != null && grid.ColumnDefinitions.Count == 3)
            {
                // Remove the middle column which is set to Auto and let it get replaced with the 
                // last column that is set to Star.
                grid.ColumnDefinitions.RemoveAt(1);
            }
        }
    }

    protected override DependencyObject GetContainerForItemOverride()
    {
        return new StretchingTreeViewItem();
    }

    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return item is StretchingTreeViewItem;
    }
}

示例用法:

<Window x:Class="WpfApplication2.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication2"
    Title="Window2" Height="300" Width="300">
<Grid>

    <local:StretchingTreeView HorizontalAlignment="Stretch" >

        <local:StretchingTreeViewItem Header="Stuff" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" >
            <Grid HorizontalAlignment="Stretch" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0">Some random text</Label>
                <TextBox Grid.Column="1" ></TextBox>

            </Grid>
        </local:StretchingTreeViewItem>
    </local:StretchingTreeView>
</Grid>

【讨论】:

  • 几乎,但它超出了窗口的边界。
  • 看起来它导致网格不断拉伸。我正在监控网格宽度,它正在迅速增加。
  • 嗯,你是对的。我认为这是一个已知问题,并且没有简单的解决方案。我正在寻找一个
  • 好的,你必须将HorizontalContentAlignment="Stretch"添加到local:StretchingTreeViewItem标签
  • 不客气 :) 也许 Bradley Uffner 的解决方案也适用于您添加 HorizontalContentAlignment="Stretch"
【解决方案2】:

问题的核心(以及解决问题的方法)描述为here

TreeViewItem 的默认 ControlTemplate 使用 3 列 x 2 行的网格,定义为内容不能水平拉伸。作者还给出了修改后的样式,改变了网格以便内容可以拉伸。

请注意,修改后的样式将TreeViewItemHorizontalContentAlignment 设置为Center,并且ControlTemplate 使用此属性来对齐内容。

要达到预期的效果,可以在修改后的样式中将HorizontalContentAlignment 设置为Stretch,或者在TreeView(或特定的TreeViewItems)。

缺少BasedOn="{StaticResource {x:Type TreeViewItem}}" 部分会导致TreeViewItem 恢复为使用默认ControlTemplate,并带有不可拉伸的网格。

<Style TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}">
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>

HierarchicalDataTemplate 中,使用ItemContainerStyle 属性可以达到效果。

@pikoh 派生自TreeViewTreeViewItem 的方法通过从代码中修改网格实现了相同的目的。

完整示例:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <Style TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type 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="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" Name="Expander">
                                    <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 Padding="5,5,5,5" Background="#00FFFFFF" Width="16" Height="16">
                                                            <Path Fill="#00FFFFFF" Stroke="#FF989898" Name="ExpandPath">
                                                                <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"
                    HorizontalAlignment="Stretch"
                    BorderThickness="{TemplateBinding Border.BorderThickness}"
                    BorderBrush="{TemplateBinding Border.BorderBrush}"
                    Padding="{TemplateBinding Control.Padding}"
                    Background="{TemplateBinding Panel.Background}"
                    SnapsToDevicePixels="True"
                    Grid.Column="1">
                                    <ContentPresenter x:Name="PART_Header"
                                Content="{TemplateBinding HeaderedContentControl.Header}"
                                ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
                                ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}"
                                ContentTemplateSelector="{TemplateBinding HeaderedItemsControl.HeaderTemplateSelector}"
                                ContentSource="Header"
                                HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                                SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                                </Border>
                                <ItemsPresenter x:Name="ItemsHost" Grid.Column="1" Grid.Row="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>
    </Window.Resources>
    <TreeView HorizontalAlignment="Stretch">
        <TreeView.Resources>
            <Style TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </TreeView.Resources>
        <TreeViewItem Header="Stuff" HorizontalAlignment="Stretch">
            <Grid HorizontalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0">Some random text</Label>
                <TextBox Grid.Column="1"></TextBox>
            </Grid>
        </TreeViewItem>
    </TreeView>
</Window>

【讨论】:

    【解决方案3】:

    由于 Microsoft 在创建 WPF 时做出的奇怪设计决定,如果不替换控件模板,树项将无法拉伸。

    http://leecampbell.blogspot.com/2009/01/horizontal-stretch-on-treeviewitems.html

    需要的样式是:

    <Style TargetType="TreeViewItem"
           BasedOn="{StaticResource {x:Type 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 IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
                              ClickMode="Press"
                              Name="Expander">
                  <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 Padding="5,5,5,5"
                                    Background="#00FFFFFF"
                                    Width="16"
                                    Height="16">
                              <Path Fill="#00FFFFFF"
                                    Stroke="#FF989898"
                                    Name="ExpandPath">
                                <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"
                        HorizontalAlignment="Stretch"
                        BorderThickness="{TemplateBinding Border.BorderThickness}"
                        BorderBrush="{TemplateBinding Border.BorderBrush}"
                        Padding="{TemplateBinding Control.Padding}"
                        Background="{TemplateBinding Panel.Background}"
                        SnapsToDevicePixels="True"
                        Grid.Column="1">
                  <ContentPresenter x:Name="PART_Header"
                                    Content="{TemplateBinding HeaderedContentControl.Header}"
                                    ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
                                    ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}"
                                    ContentTemplateSelector="{TemplateBinding HeaderedItemsControl.HeaderTemplateSelector}"
                                    ContentSource="Header"
                                    HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                                    SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                </Border>
                <ItemsPresenter x:Name="ItemsHost"
                                Grid.Column="1"
                                Grid.Row="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>
    

    【讨论】:

    • 这似乎适用于TreeViewItem 的标头本身,但不适用于其内容。我会用图片更新OP。
    • 我过去使用过它,它一直对我有用,尽管我从来没有比项目中的简单文本块更复杂的东西。这可能是由于您更复杂的布局需求。如果您使用允许您检查活动元素的东西,例如 Snoop,它是否会显示项目模板的全宽?
    【解决方案4】:

    好像是 Grid's HorizontalAlignment 问题。我已经在 .Net Framework 4 中尝试过,一切正常。即使您将HorizontalAlignment 指定为Stretch,似乎在4.5 中,它实际上并没有拉伸它。因此,您可以进行如下绑定:

    <Grid HorizontalAlignment="Stretch" 
          Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},Path=ActualWidth,Mode=OneTime}"
                  >
    

    因为您可以在运行时看到 TreeViewItem 具有预期的宽度,但 Grid 没有。

    【讨论】:

    • 嗯。我确实在 4.6.1 和 3.5 中尝试过,但我没有尝试 4。我明天早上再试一次,我也许可以在 4 中逃脱这座装配大楼。 app在4.5有什么影响?
    • @Logan 不,它应该会导致任何兼容性问题。但我不太确定你是否能够像那样解决你的问题。因为在运行时应用程序将使用 4.5 中的 WPF 组件(只是一个假设):(...最好用代码或绑定来处理它.
    • 我刚刚在 .NET 4 中尝试过,但它仍然无法正常工作......有趣,也许它对你来说是环境问题?还。绑定会导致树视图陷入扩展循环,因为它会根据内容扩展其大小,并且内容会随着树视图的扩展而不断增长。
    • @Logan 如果你不想让它扩展,你可以将模式设置为 Mode=OneTime
    • 不错且简单的解决方案。谢谢你。但是,在将树视图项目扩展到整个树视图宽度后,我得出的结论是,我无法再打开树视图本身的右键单击上下文菜单。相反,我将始终打开树视图项的右键单击上下文菜单。
    【解决方案5】:

    您只需将Grid.ColumnSpan='2' 添加到TreeViewItemControlTemplate,如下所示。

    就是这样!

    说明: 默认ControlTemplate 将标题内容放在不拉伸的网格列中。 Grid.ColumnSpan='2' 指示 Header 内容跨越到 Grid 的其余部分。

    【讨论】:

      猜你喜欢
      • 2013-06-04
      • 2010-09-21
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2016-10-28
      • 2011-05-21
      • 1970-01-01
      • 2015-12-28
      相关资源
      最近更新 更多