WPF ListView显示GridLine(可选)

有的代码是大神提供的,只是整理了一下

效果



修改GridLine是否可见,以及线宽:

<Visibility x:Key="ListView.GridLine.Horizontal.Visibility">Collapsed</Visibility>
<Visibility x:Key="ListView.GridLine.Vertical.Visibility">Collapsed</Visibility>
<!--<Visibility x:Key="ListView.GridLine.Horizontal.Visibility">Visible</Visibility>-->
<!--<Visibility x:Key="ListView.GridLine.Vertical.Visibility">Visible</Visibility>-->
        
<sys:Double x:Key="ListView.GridLine.Horizontal.Width">2</sys:Double>
<sys:Double x:Key="ListView.GridLine.Vertical.Width">1</sys:Double>
<!--第3个值(右边间距)必须和列线width相同-->
<Thickness x:Key="ListView.Thumb.Margin">0,0,-1,0</Thickness>
<sys:Double x:Key="ListView.Header.Height">40</sys:Double>
<SolidColorBrush x:Key="ListView.Header.Background">#80365080</SolidColorBrush>
<SolidColorBrush x:Key="ListView.Header.Foreground">#80FFFFFF</SolidColorBrush>


Style:

<Window x:Class="ListViewTest.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:ListViewTest"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="500" Width="790">
    
    <Window.Resources>
        <local:V2VConveter x:Key="V2V"/>

        <XmlDataProvider x:Key="People">
            <x:XData>
                <People xmlns="">
                    <Person>
                        <Name>Peter</Name>
                        <Surname>Black</Surname>
                        <Age>25</Age>
                    </Person>
                    <Person>
                        <Name>John</Name>
                        <Surname>Smith</Surname>
                        <Age>35</Age>
                    </Person>
                    <Person>
                        <Name>tom</Name>
                        <Surname>cat</Surname>
                        <Age>15</Age>
                    </Person>
                    <Person>
                        <Name>TELL</Name>
                        <Surname>Ahalp</Surname>
                        <Age>34</Age>
                    </Person>
                    <Person>
                        <Name>JODan</Name>
                        <Surname>JD</Surname>
                        <Age>54</Age>
                    </Person>
                    <Person>
                        <Name>Jams</Name>
                        <Surname>Js</Surname>
                        <Age>37</Age>
                    </Person>
                    <Person>
                        <Name>WeiDe</Name>
                        <Surname>WD</Surname>
                        <Age>39</Age>
                    </Person>
                    <Person>
                        <Name>YaoMing</Name>
                        <Surname>YM</Surname>
                        <Age>37</Age>
                    </Person>
                </People>
            </x:XData>
        </XmlDataProvider>

        <!--GridLine-->
        <Visibility x:Key="ListView.GridLine.Horizontal.Visibility">Collapsed</Visibility>
        <Visibility x:Key="ListView.GridLine.Vertical.Visibility">Collapsed</Visibility>
        <!--<Visibility x:Key="ListView.GridLine.Horizontal.Visibility">Visible</Visibility>-->
        <!--<Visibility x:Key="ListView.GridLine.Vertical.Visibility">Visible</Visibility>-->
        
        <sys:Double x:Key="ListView.GridLine.Horizontal.Width">2</sys:Double>
        <sys:Double x:Key="ListView.GridLine.Vertical.Width">1</sys:Double>
        <!--第3个值(右边坚决)必须和列线width相同-->
        <Thickness x:Key="ListView.Thumb.Margin">0,0,-1,0</Thickness>
        <sys:Double x:Key="ListView.Header.Height">40</sys:Double>
        <SolidColorBrush x:Key="ListView.Header.Background">#80365080</SolidColorBrush>
        <SolidColorBrush x:Key="ListView.Header.Foreground">#80FFFFFF</SolidColorBrush>

        <LinearGradientBrush x:Key="ListView.GridLine.Horizontal.Brush" StartPoint="0,0" EndPoint="0,1">
            <LinearGradientBrush.GradientStops>
                <GradientStop Color="Orange" Offset="0"/>
                <GradientStop Color="Black" Offset="0.5"/>
                <GradientStop Color="Orange" Offset="1"/>
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
        
        <LinearGradientBrush x:Key="ListView.GridLine.Horizontal.MouseOver.Brush" StartPoint="0,0" EndPoint="0,1">
            <LinearGradientBrush.GradientStops>
                <GradientStop Color="OrangeRed" Offset="0"/>
                <GradientStop Color="WhiteSmoke" Offset="0.5"/>
                <GradientStop Color="OrangeRed" Offset="1"/>
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>

        <LinearGradientBrush x:Key="ListView.GridLine.Vertical.Brush" StartPoint="0,0" EndPoint="1,0">
            <LinearGradientBrush.GradientStops>
                <GradientStop Color="WhiteSmoke" Offset="0"/>
                <GradientStop Color="Black" Offset="0.5"/>
                <GradientStop Color="WhiteSmoke" Offset="1"/>
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>

        <Style x:Key="ListViewHeaderThumb" TargetType="Thumb">
            <Setter Property="Background" Value="Chocolate"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Thumb}">
                        <Border Padding="{TemplateBinding Padding}" Background="Transparent" Width="10"
                                Margin="{StaticResource ListView.Thumb.Margin}"
                                HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                            <Rectangle Width="{StaticResource ListView.GridLine.Vertical.Width}" 
                                       Fill="{StaticResource ListView.GridLine.Vertical.Brush}"
                                       HorizontalAlignment="Right" VerticalAlignment="Stretch"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style x:Key="DefaultListViewHeader" TargetType="GridViewColumnHeader">
            <Setter Property="Foreground" Value="{StaticResource ListView.Header.Foreground}"/>
            <Setter Property="Background" Value="{StaticResource ListView.Header.Background}"/>
            <Setter Property="SnapsToDevicePixels" Value="True"/>
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Margin" Value="0"/>
            <Setter Property="Padding" Value="0"/>
            <Setter Property="MinHeight" Value="20"/>
            <Setter Property="Height" Value="{StaticResource ListView.Header.Height}"/>
            <Setter Property="BorderThickness" Value="0"/>
            <Setter Property="BorderBrush" Value="Green"/>
            <Setter Property="FontSize" Value="18"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="GridViewColumnHeader">
                        <Border x:Name="HeaderBorder" Padding="0" Margin="0,0,0,0"
                                Background="{TemplateBinding Background}"
                                BorderThickness="{TemplateBinding BorderThickness}" 
                                BorderBrush="{TemplateBinding BorderBrush}">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                <ContentPresenter x:Name="HeaderContent" Content="{TemplateBinding Content}"
                                              ContentTemplate="{TemplateBinding ContentTemplate}"
                                              Margin="0" RecognizesAccessKey="True"
                                              HorizontalAlignment="Center" VerticalAlignment="Center"
                                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

                                <Thumb x:Name="PART_HeaderGripper" Grid.Column="1" HorizontalAlignment="Right"
                                       Style="{StaticResource ListViewHeaderThumb}"/>
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <DataTrigger Binding="{Binding IsDragging, ElementName=PART_HeaderGripper}" Value="True">
                                <Setter Property="Foreground" Value="Lavender"/>
                                <Setter Property="FontSize" Value="20"/>
                                <Setter TargetName="HeaderBorder" Property="Background" Value="Violet"/>
                            </DataTrigger>
                            
                            <Trigger Property="IsPressed" Value="true">
                                <Setter TargetName="HeaderContent" Property="Margin" Value="6,1,6,1" />
                                <Setter Property="Foreground" Value="Cyan"/>
                                <Setter Property="FontSize" Value="20"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <TextBlock TextBlock.FontWeight="SemiBold" Text="{Binding}" TextAlignment="Center"/>
                    </DataTemplate>
                </Setter.Value>
            </Setter>

            <Style.Triggers>
                <Trigger Property="Role" Value="Floating">
                    <Setter Property="Opacity" Value="0.7"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="GridViewColumnHeader">
                                <Canvas Name="PART_FloatingHeaderCanvas">
                                    <Rectangle Fill="#60000000" Width="{TemplateBinding ActualWidth}" Height="{TemplateBinding ActualHeight}" />
                                </Canvas>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>


        <Style x:Key="DefaultGridViewScrollViewerStyle" TargetType="{x:Type ScrollViewer}" BasedOn="{StaticResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
            <Setter Property="Focusable" Value="false" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ScrollViewer}">
                        <Grid Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*" />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <DockPanel Margin="{TemplateBinding Padding}">
                                <ScrollViewer DockPanel.Dock="Top" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
                                    <GridViewHeaderRowPresenter AllowsColumnReorder="{Binding TemplatedParent.View.AllowsColumnReorder, RelativeSource={RelativeSource TemplatedParent}}"
                                                            ColumnHeaderContainerStyle="{Binding TemplatedParent.View.ColumnHeaderContainerStyle, RelativeSource={RelativeSource TemplatedParent}}"
                                                            ColumnHeaderToolTip="{Binding TemplatedParent.View.ColumnHeaderToolTip, RelativeSource={RelativeSource TemplatedParent}}"
                                                            ColumnHeaderStringFormat="{Binding TemplatedParent.View.ColumnHeaderStringFormat, RelativeSource={RelativeSource TemplatedParent}}"
                                                            ColumnHeaderContextMenu="{Binding TemplatedParent.View.ColumnHeaderContextMenu, RelativeSource={RelativeSource TemplatedParent}}"
                                                            ColumnHeaderTemplate="{Binding TemplatedParent.View.ColumnHeaderTemplate, RelativeSource={RelativeSource TemplatedParent}}"
                                                            Columns="{Binding TemplatedParent.View.Columns, RelativeSource={RelativeSource TemplatedParent}}"
                                                            ColumnHeaderTemplateSelector="{Binding TemplatedParent.View.ColumnHeaderTemplateSelector, RelativeSource={RelativeSource TemplatedParent}}"
                                                            Margin="0" Visibility="Visible" x:Name="PART_Header" Height="auto"
                                                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                </ScrollViewer>
                                <ScrollContentPresenter x:Name="PART_ScrollContentPresenter"
                                                    CanContentScroll="{TemplateBinding CanContentScroll}"
                                                    ContentTemplate="{TemplateBinding ContentTemplate}"
                                                    Content="{TemplateBinding Content}"
                                                    KeyboardNavigation.DirectionalNavigation="Local"
                                                    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                            </DockPanel>

                            <ScrollBar x:Name="PART_HorizontalScrollBar" Cursor="Arrow" Maximum="{TemplateBinding ScrollableWidth}"
                                   Minimum="0.0" Orientation="Horizontal" Grid.Row="1"
                                   Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
                                   Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
                                   ViewportSize="{TemplateBinding ViewportWidth}" />
                            <ScrollBar x:Name="PART_VerticalScrollBar" Cursor="Arrow" Grid.Column="1" Maximum="{TemplateBinding ScrollableHeight}"
                                   Minimum="0.0" Orientation="Vertical"
                                   Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
                                   Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
                                   ViewportSize="{TemplateBinding ViewportHeight}" />
                        </Grid>
                        <ControlTemplate.Triggers>
                            <DataTrigger Binding="{Binding Columns, ElementName=PART_Header}" Value="{x:Null}">
                                <Setter Property="Visibility" TargetName="PART_Header" Value="Collapsed"></Setter>
                            </DataTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <Grid>
        <StackPanel Orientation="Vertical">
            <ListView Name="PeopleList"
                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
                      ScrollViewer.VerticalScrollBarVisibility="Auto"
                      ItemsSource="{Binding Source={StaticResource People},XPath=/People/Person}"
                      BorderThickness="0" BorderBrush="Black"
                      ScrollViewer.CanContentScroll="True"
                      VirtualizingStackPanel.IsVirtualizing="True"
                      VirtualizingStackPanel.VirtualizationMode="Recycling"
                      ScrollViewer.IsDeferredScrollingEnabled="False"
                      OverridesDefaultStyle="true"
                      SelectionMode="Single"
                      AlternationCount="2">
                <ListView.Template>
                    <ControlTemplate TargetType="{x:Type ListView}">
                        <Border x:Name="Border" SnapsToDevicePixels="true"
                                Background="{TemplateBinding Background}" 
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}">
                            <ScrollViewer Padding="{TemplateBinding Padding}" Style="{StaticResource DefaultGridViewScrollViewerStyle}">
                                <ItemsPresenter/>
                            </ScrollViewer>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsGrouping" Value="true">
                                <Setter Property="ScrollViewer.CanContentScroll" Value="false" />
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter TargetName="Border" Property="Opacity" Value="0.4" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </ListView.Template>
                <ListView.ItemContainerStyle>
                    <Style TargetType="{x:Type ListViewItem}">
                        <Setter Property="Margin" Value="0"/>
                        <Setter Property="Padding" Value="0"/>
                        <!--也可以通过BorderThickness和BorderBrush的Bottom设置水平线条宽度和颜色-->
                        <Setter Property="BorderBrush" Value="LightGray"/>
                        <Setter Property="BorderThickness" Value="0,0,0,0"/>
                        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                        <Setter Property="FontSize" Value="16"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ListViewItem}">
                                    <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" 
                                        BorderThickness="{TemplateBinding BorderThickness}" 
                                        Background="{TemplateBinding Background}">
                                        <Grid>
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="*"/>
                                                <RowDefinition Height="Auto"/>
                                            </Grid.RowDefinitions>

                                            <local:GridViewRowPresenterWithGridLines Height="60"
                                                Columns="{TemplateBinding GridView.ColumnCollection}"
                                                Margin="{TemplateBinding Padding}"
                                                GridLineWidth="{StaticResource ListView.GridLine.Vertical.Width}"
                                                GridLineBrush="{StaticResource ListView.GridLine.Vertical.Brush}"
                                                GridLinesVisibility="{StaticResource ListView.GridLine.Horizontal.Visibility}"/>

                                            <!--水平线条-->
                                            <Rectangle x:Name="horLine" Grid.Row="1" Height="{StaticResource ListView.GridLine.Horizontal.Width}"
                                                       HorizontalAlignment="Stretch" VerticalAlignment="Bottom"
                                                       Fill="{StaticResource ListView.GridLine.Horizontal.Brush}"
                                                       Visibility="{StaticResource ListView.GridLine.Vertical.Visibility}"/>

                                        </Grid>
                                    </Border>

                                    <ControlTemplate.Triggers>
                                        <!--设置隔行背景-->
                                        <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                                            <Setter TargetName="border" Property="Background" Value="#50e9e9e9"/>
                                        </Trigger>
                                        <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                                            <Setter TargetName="border" Property="Background" Value="#FFe9e9e9"/>
                                        </Trigger>
                                        
                                        <!--鼠标经过-->
                                        <Trigger Property="IsMouseOver" Value="True">
                                            <Setter TargetName="border" Property="Background" Value="#D0BA7DF4"/>
                                            <Setter TargetName="horLine" Property="Fill" Value="{StaticResource ListView.GridLine.Horizontal.MouseOver.Brush}"/>
                                            <Setter Property="Foreground" Value="WhiteSmoke"/>
                                            <Setter Property="FontSize" Value="20"/>
                                        </Trigger>

                                        <!--被选中-->
                                        <Trigger Property="IsSelected" Value="true">
                                            <Setter TargetName="border" Property="Background" Value="#A145F8" />
                                            <Setter Property="Foreground" Value="WhiteSmoke" />
                                        </Trigger>


                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="IsSelected" Value="true" />
                                                <Condition Property="Selector.IsSelectionActive" Value="True" />
                                            </MultiTrigger.Conditions>

                                            <Setter Property="Background" Value="Red" />
                                            <Setter Property="Foreground" Value="WhiteSmoke" />
                                        </MultiTrigger>
                                        
                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="IsEnabled" Value="False" />
                                                <Condition Property="IsSelected" Value="True" />
                                            </MultiTrigger.Conditions>
                                            <MultiTrigger.Setters>
                                                <Setter TargetName="border" Property="Opacity" Value="0.4" />
                                            </MultiTrigger.Setters>
                                        </MultiTrigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </ListView.ItemContainerStyle>
                <ListView.View>
                    <GridView ColumnHeaderContainerStyle="{StaticResource DefaultListViewHeader}">
                    <!--<GridView>-->
                        <GridViewColumn Width="360" Header="Name" DisplayMemberBinding="{Binding XPath=Name}"/>
                        <GridViewColumn Width="280" Header="Surname" DisplayMemberBinding="{Binding XPath=Surname}"/>
                        <GridViewColumn Width="150" Header="Age" DisplayMemberBinding="{Binding XPath=Age}"/>
                    </GridView>
                </ListView.View>
            </ListView>

            <!--<ListView Margin="5" BorderThickness="1" 
                ItemsSource="{Binding Source={StaticResource People},XPath=/People/Person}">
                <ListView.BorderBrush>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                        <GradientStop Color="Orange" Offset="0"/>
                        <GradientStop Color="Black" Offset="0.5"/>
                        <GradientStop Color="Orange" Offset="1"/>
                    </LinearGradientBrush>
                </ListView.BorderBrush>
            </ListView>-->
        </StackPanel>
    </Grid>
</Window>

CS

public class GridViewRowPresenterWithGridLines : GridViewRowPresenter
{
    private static readonly Style DefaultSeparatorStyle;
    public static readonly DependencyProperty SeparatorStyleProperty;
    private readonly List<FrameworkElement> verticalLines = new List<FrameworkElement>();

    static GridViewRowPresenterWithGridLines()
    {
        DefaultSeparatorStyle = new Style(typeof(Rectangle));
        DefaultSeparatorStyle.Setters.Add(new Setter(Shape.FillProperty, SystemColors.ControlLightBrush));
        SeparatorStyleProperty = DependencyProperty.Register(nameof(SeparatorStyle), typeof(Style), typeof(GridViewRowPresenterWithGridLines),
                                                                new UIPropertyMetadata(DefaultSeparatorStyle, SeparatorStyleChanged));
    }

    public Style SeparatorStyle
    {
        get { return (Style)GetValue(SeparatorStyleProperty); }
        set { SetValue(SeparatorStyleProperty, value); }
    }

    public static readonly DependencyProperty GridLinesVisibilityProperty = DependencyProperty.Register(nameof(GridLinesVisibility), typeof(Visibility),
                                                                    typeof(GridViewRowPresenterWithGridLines), new PropertyMetadata(Visibility.Collapsed));
    public Visibility GridLinesVisibility
    {
        get { return (Visibility)GetValue(GridLinesVisibilityProperty); }
        set { SetValue(GridLinesVisibilityProperty, value); }
    }

    public static readonly DependencyProperty GridLineWidthProperty = DependencyProperty.Register(nameof(GridLineWidth), typeof(double),
                                                                    typeof(GridViewRowPresenterWithGridLines), new PropertyMetadata(1.0));
    public double GridLineWidth
    {
        get { return (double)GetValue(GridLineWidthProperty); }
        set { SetValue(GridLineWidthProperty, value); }
    }

    public static readonly DependencyProperty GridLineBrushProperty = DependencyProperty.Register(nameof(GridLineBrush), typeof(Brush),
                                                                    typeof(GridViewRowPresenterWithGridLines), new PropertyMetadata(Brushes.Black));
    public Brush GridLineBrush
    {
        get { return (Brush)GetValue(GridLineBrushProperty); }
        set { SetValue(GridLineBrushProperty, value); }
    }

    private IEnumerable<FrameworkElement> Children
    {
        get { return LogicalTreeHelper.GetChildren(this).OfType<FrameworkElement>(); }
    }

    private static void SeparatorStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var presenter = (GridViewRowPresenterWithGridLines)d;
        var style = (Style)e.NewValue;
        foreach (FrameworkElement line in presenter.verticalLines)
        {
            line.Style = style;
        }
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        var size = base.ArrangeOverride(arrangeSize);
        var children = Children.ToList();

        Visibility visible = (Visibility)(this.GetValue(GridLinesVisibilityProperty));
        if (Visibility.Collapsed == visible)
        {
            return size;
        }

        EnsureLines(children.Count);

        double width = (double)(this.GetValue(GridLineWidthProperty));
        for (var i = 0; i < verticalLines.Count; i++)
        {
            var child = children[i];

            if (i == verticalLines.Count - 1)
            {
                break;
            }

            //var x = child.TransformToAncestor(this).Transform(new Point(child.ActualWidth, 0)).X + child.Margin.Right;
            var x = child.TransformToAncestor(this).Transform(new Point(child.ActualWidth, 0)).X + child.Margin.Right;
            var rect = new Rect(x, -Margin.Top, width, size.Height + Margin.Top + Margin.Bottom);
            var line = verticalLines[i];
            line.Measure(rect.Size);
            line.Arrange(rect);
        }
        return size;
    }

    private void EnsureLines(int count)
    {
        count = count - verticalLines.Count;
        for (var i = 0; i < count; i++)
        {
            var line = (FrameworkElement)Activator.CreateInstance(SeparatorStyle.TargetType);
            //line = new Rectangle { Fill = Brushes.Red };
            line = new Rectangle { Fill = (Brush)(this.GetValue(GridLineBrushProperty)) };
            line.Style = SeparatorStyle;
            AddVisualChild(line);
            verticalLines.Add(line);
        }
    }

    protected override int VisualChildrenCount
    {
        get { return base.VisualChildrenCount + verticalLines.Count; }
    }

    protected override Visual GetVisualChild(int index)
    {
        var count = base.VisualChildrenCount;
        return index < count ? base.GetVisualChild(index) : verticalLines[index - count];
    }
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: WPF (Windows Presentation Foundation) ListView是一种非常功能强大的控件,可以允许用户进行编辑操作。编辑操作可以包括添加、修改和删除项目。 在WPFListView控件中,有两种编辑模式:行编辑模式和单元格编辑模式。 行编辑模式是指用户可以更改整个行的内容,包括行中的所有列。可以通过将ListView控件的IsEditable属性设置为true来启用行编辑模式。此时,用户可以双击某一行来进行编辑,也可以通过键盘快捷键来进行操作。 单元格编辑模式是指用户可以更改特定列中的单元格内容。可以通过将ListView控件的View属性设置为GridView,并将GridViewColumn的IsEditable属性设置为true来启用单元格编辑模式。此时,用户可以单击单元格来进行编辑。 总之,WPF ListView控件具有强大的可编辑功能,可以让用户在应用程序中进行更方便的数据管理和编辑操作。 ### 回答2: WPF(Windows Presentation Foundation)是Microsoft开发的用户界面框架,可帮助开发人员创建富客户端应用程序。其中一个重要的功能是ListView控件。ListView控件是用于显示项目列表的控件,其中每个项目可以具有多个属性。在默认情况下,这些属性只能被看作文本,并为只读状态。但是,WPF ListView控件可以通过启用编辑模式来使每个项目的属性可编辑。 启用ListView控件的编辑模式有两种方法: 1.设置ListView控件的IsEditable属性为true 2.将ListView控件的ItemTemplate设置为一个带有编辑控件(例如TextBox、ComboBox等)的DataTemplate 使用第一种方法时,启用编辑模式后,可双击项目或选择项目并按F2来开始编辑。此时,项目文本将变为编辑控件并显示ListView控件中。您可以键入或选择新值并按Enter键来保存更改。 使用第二种方法时,使用自定义DataTemplate来呈现每个项目。该模板可以包括多个编辑控件,以便可以编辑多个属性。在编辑模式下,单击项目时,所有与该项目相关的控件将变为可编辑状态。您可以修改所需的属性,然后按Enter键或单击“完成”按钮来保存更改。 总之,WPF ListView控件可编辑,且启用编辑模式的方法非常简单。它使用户能够轻松编辑列表项,并帮助开发人员提高应用程序的可用性和交互性。 ### 回答3: WPF(Windows Presentation Foundation)是一种用于构建桌面应用程序的技术。在WPF中,可以使用ListView控件来实现数据绑定和呈现功能。ListView是一种灵活的控件,可以用于显示和编辑列表数据。 ListView控件提供了许多功能,其中包括可编辑特性。ListView可编辑功能使得用户可以在List中添加、编辑和删除数据项。对于这些数据项的增删改操作,WPF提供了一些内置的控件和方法,比如TextBox、CheckBox、ComboBox等。使用这些控件与ListView控件结合使用,可以轻松实现ListView的编辑功能。 具体实现方法是:首先,需要在ListView中启用编辑功能。可以通过设置ListView的IsEditable属性来实现。然后,在ListView中添加需要编辑的数据项。通过设置ListView的ItemTemplate属性,可以定义编辑每个数据项时所使用的控件,例如TextBox、CheckBox或ComboBox。使用这些控件,可以让用户输入或选择需要编辑的数据。最后,将更改保存到原有的数据中。 总之,WPF中的ListView控件提供了非常方便的编辑功能,可以让用户轻松地对列表数据进行管理和编辑。无论是初学者还是有经验的开发人员,都可以受益于ListView的可编辑功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneOnce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值