快捷搜索:

[WPF]解决ListView在没有Items时,水平滚动条不出现

在上一篇Blog中指出了ListView在没有Items时,纵然Header越过了控件范围,水平滚动条也不会呈现的问题。因为篇幅和光阴所限,没有给出办理规划。下面就先容一种办理规划。详细问题请参考上篇文章,这里就不赘述了。

办理这个问题分两个步骤:

1.把Header放到ScrollViewer中可以Scroll的部分里。

2.让Header在拖动垂直滚动条时不动。(难点,明明在ScrollViewer里,却不能动。)

第一个步骤很好做。把GridViewHeaderRowPresenter和ItemsPresenter一路放在ListView的ScrollViewer里便是了。(本来只有ItemsPresenter在ListView的ScrollViewer里。)

这里要谢谢一下ListView的优秀设计——真正做到了Logic和Visual的分离。只要把GridViewHeaderRowPresenter的XAML剪切到另一个位置就可以了。什么都不用改。我们在实现自己的控件时,也应该能够达到这种易费用。

然则第二个步骤就不那么轻易了。直到我在WPF Toolkit里看到了一个振奋民心的类名——SelectiveScrollingGrid。第一感到便是这恰是我想要的功能。本日终于有空钻研钻研了。

结果发明被忽悠了。这个名字很能勾引民心,看名字会以为是,在这个Grid中,可以指定哪些器械会Scroll,哪些器械不会Scroll。着实我应该猜获得了,微软也不傻,做个功能照样很倾向于用简单的措施的。这个SeletiveScrollingGrid没有节制内部的器械Scroll不Scroll,全都Scroll,只是把一部分的Child,用RenderTransform拉回原位,看起来象是没有动一样。

看它的实现要领,这个Grid的名字应该叫RenderBackOnScrollGrid。用RenderTransform和真正的SelectiveScrolling有什么差别呢?请参考错位的RenderTransform动画。我猜在这里也会有潜在的问题的。

好了言归正传,我们来动手办理第二个问题。办理规划如下画所示:

左图是原ListView的Template,右图是修正后的ListView Template。翰墨描述就省了。此中SelectiveScrollingGrid的代码是。

SelectiveScrollingPart

local:SelectiveScrollingGrid>

local:SelectiveScrollingGrid.RowDefinitions>

RowDefinition Height="Auto"/>

RowDefinition/>

local:SelectiveScrollingGrid.RowDefinitions>

ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Grid.Row="1"/>

ScrollViewer HorizontalScrollBarVisibility="Hidden"

VerticalScrollBarVisibility="Hidden"

local:SelectiveScrollingGrid.SelectiveScrollingOrientation="Horizontal">

GridViewHeaderRowPresenter

Margin="2,0,2,0"

SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"

AllowsColumnReorder="{Binding View.AllowsColumnReorder, RelativeSource={RelativeSource TemplatedParent}}"

ColumnHeaderContainerStyle="{Binding View.ColumnHeaderContainerStyle, RelativeSource={RelativeSource TemplatedParent}}"

ColumnHeaderContextMenu="{Binding View.ColumnHeaderContextMenu, RelativeSource={RelativeSource TemplatedParent}}"

ColumnHeaderStringFormat="{Binding View.ColumnHeaderStringFormat, RelativeSource={RelativeSource TemplatedParent}}"

ColumnHeaderTemplate="{Binding View.ColumnHeaderTemplate, RelativeSource={RelativeSource TemplatedParent}}"

ColumnHeaderTemplateSelector="{Binding View.ColumnHeaderTemplateSelector, RelativeSource={RelativeSource TemplatedParent}}"

ColumnHeaderToolTip="{Binding View.ColumnHeaderToolTip, RelativeSource={RelativeSource TemplatedParent}}"

Columns="{Binding View.Columns, RelativeSource={RelativeSource TemplatedParent}}"/>

ScrollViewer>

local:SelectiveScrollingGrid>

您可能还会对下面的文章感兴趣: