gpt4 book ai didi

wpf - 如何在 WPF TreeView 中突出显示整行

转载 作者:行者123 更新时间:2023-12-03 18:35:02 26 4
gpt4 key购买 nike

我想调整默认的 WPF TreeView/TreeViewItem 模板,以便可以突出显示整行,如图所示:

enter image description here

但是,我尝试了谷歌搜索中的几个模板,但没有一个可以真正产生效果,一些错误的答案甚至被标记为正确......

代码流中有一个答案似乎有效,但它添加了额外的 C# 代码,或者不需要额外的代码但工作不完美。

我不想添加额外的 C# 代码,而只想更改默认模板。
有人有什么好主意吗?

非常感谢!

- - 编辑 - -

@Nick,使用您的模板后,显示如下,

首先,它没有突出显示“整个”行,“整个”是指树的最宽宽度。

其次,它突出了包括 child 在内的其他领域。

enter image description here

最佳答案

我最近不得不做一些类似的事情,虽然这个问题已经很老了,但我认为像我一样偶然发现这个页面的其他人可能能够从我的解决方案中得到一些东西。

我还编辑了 ControlTemplate,就像 Tim 在评论中描述的那样。我将“Expander”切换按钮和“Bd”边框控件分组到一个横跨整个 TreeView 宽度的网格中。然后在 IsSelected 触发器下,我将高亮设置为新创建的网格而不是边框​​。

这是带有我编辑的 TreeView 的 ControlTemplate:

<ControlTemplate TargetType="{x:Type TreeViewItem}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="19" Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<!-- created ItemRowGrid to contain both togglebutton and border -->
<Grid x:Name="ItemRowGrid" Grid.ColumnSpan="3" Margin="1.5,0,0,0">
<ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}" HorizontalAlignment="Left" d:LayoutOverrides="Width, LeftMargin, RightMargin"/>
<Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="0" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true" Margin="17.5,0,-17.5,0">
<ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
</Grid>
<ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="false">
<Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/>
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter Property="Visibility" TargetName="Expander" Value="Hidden"/>
</Trigger>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
<!-- setting highlight target to created ItemRowGrid instead of border -->
<Setter Property="Background" TargetName="ItemRowGrid" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="IsSelectionActive" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
</MultiTrigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

这并不完全是 OP 要求的方式,因为“子”行的突出显示以缩进开头。但它确实正确地突出显示了每一行而不包括子项。

关于wpf - 如何在 WPF TreeView 中突出显示整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27398781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com