【发布时间】:2017-08-02 13:42:01
【问题描述】:
我正在寻找修改 WPF ListView 以便水平呈现项目,并且在第一项和所有后续项目之间有一个分隔符。像这样:
我有水平位,但我被分隔符卡住了。我尝试使用 DataTemplate,但这会将分隔符合并到实际项目中,这意味着当我悬停时它会突出显示(注意我使用的是 Caliburn,但我认为它不会对问题产生太大影响):
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</UserControl.Resources>
<StackPanel Margin="20">
<ListView Name="Items" BorderThickness="0">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<ContentControl cal:View.Model="{Binding}" />
<Border Name="Separator" Width="2" Margin="5,10" HorizontalAlignment="Center" Background="Red" Visibility="{Binding IsFirst, Converter={StaticResource BooleanToVisibilityConverter}}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
</StackPanel>
Items 是带有此边框的非常基本的视图:
<Border Background="White" BorderBrush="Black" BorderThickness="2">
DataTemplate 的外观:
在花了一上午的时间阅读模板后,我决定使用 ControlTemplate 作为解决方案,经过一番努力,我得到了以下代码:
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<Style TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<StackPanel Margin="10" Orientation="Horizontal">
<ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" />
<Border Name="Separator" Width="2" Margin="5,10" HorizontalAlignment="Center" Background="Red" Visibility="{Binding IsFirst, Converter={StaticResource BooleanToVisibilityConverter}}" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<StackPanel>
<ListView Name="Items">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
</StackPanel>
这看起来几乎相同,但现在由于某种原因我无法突出显示项目。我想也许我也覆盖了触发器,并尝试根据以下答案添加 ControlTemplate.Triggers 条目:Change selection-color of WPF ListViewItem 以恢复突出显示行为,但没有成功。
我怎样才能得到我正在寻找的结果,ControlTemplate 是进行此更改的正确位置吗?
编辑:理想情况下,我正在寻找仅使用 xaml 的解决方案。
【问题讨论】:
-
该分隔符是项目容器的一部分,而不是
ListViewItem本身。你现在用的是水平的StackPanel,试着写自己的HorizontalPanelWithSeparator。 -
我会试试的,谢谢。
标签: c# wpf listview controltemplate