我会尽量简短的。
我需要的是一个ListView :
ScrollBarListView上使用Scroll Wheel时,Children Elements会滚动ListView有一个属性,它告诉它只显示完整的元素,而不是部分元素。我尝试了什么:
ListView以UniformGrid作为其ItemsTemplate,但UniformGrid允许您定义实际Grid有多少rows,而不是List显示了多少元素。另外,我在滚动方面有问题,但也许我做错了什么。有什么想法吗?谢谢!
编辑:
我想我找到了一种让Children Elements鼓起Scroll Event的方法。
Child elements of scrollviewer preventing scrolling with mouse wheel?
但这会迫使我在名单上的每一个小控制上使用这种行为。还有别的办法吗?
Edit2:
Mark Feldman已经解决了我的大部分问题。其中一项仍在继续:
ListView来显示,比如说6个元素。最后,ListView的高度必须是6*ChildElement。我猜我得手工计算。我想我可以在XAML或codeBehind中做到这一点。我真的很想在XAML中这样做,我想我必须绑定到配置中的元素,该元素表示应该有多少元素是可见的,并将其乘以ActualHeight of ItemTemplate。是可行的吗?发布于 2013-12-05 08:12:57
只要禁用垂直滚动条的可见性,其他一切都应如您所描述的那样工作。
<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled">发布于 2014-01-16 01:31:28
我遇到了一个需要想出解决你第二个问题的办法。该解决方案非常容易受到布局更改的影响,不建议使用,但它似乎是完成任务的唯一方法:
private void List_OnSizeChanged(object sender, SizeChangedEventArgs e)
{
var list = sender as ListViewBase; // works with ListView or GridView
if (list == null || list.Items == null)
{
return;
}
var nMax = 6; // set this to your desired number of items
var n = list.Items.Count;
var gen = list.ItemContainerGenerator;
if (gen != null)
{
var height = 0.0;
DependencyObject o;
for (var i = 0;
i < nMax
&& i < n
&& (o = gen.ContainerFromIndex(i)) != null;
i++)
{
// calculate running height
var h = o.GetValue(ActualHeightProperty) as double? ?? 0;
height += h+2;
}
// set height, unsub and resub to listeners otherwise endless layout cycle
if (height > 0)
{
list.SizeChanged -= List_OnSizeChanged;
list.Height = height;
list.SizeChanged += List_OnSizeChanged;
}
}
}使用上述事件处理程序订阅列表的SizeChanged事件,并将nMax更改为所需的项数。
如果您的列表项正在虚拟化,并且ItemsContainerGenerator为null,则可能必须通过将ItemsPanel更改为StackPanel这样的具体元素来强制实现:
<ListView>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>在我的例子中,我还需要允许动态数量的项目,以便它们完全填充容器(而不是固定数量的项目),这个解决方案是从上面修改的,但是更容易受到布局更改的影响,并且可能需要更仔细的集成:
private void List_OnSizeChanged(object sender, SizeChangedEventArgs e)
{
var list = sender as ListViewBase;
if (list == null || list.Items == null)
{
return;
}
var n = list.Items.Count;
var containingFixedGrid = FindVisualParent<Grid>(list); // this is an attempt to get the first container that is bounded by the actual height of the UI, in my case and the general case it is probably going to be a grid, but you may need to update this to whatever element makes sense; you can also use a named element
if (containingFixedGrid == null || containingFixedGrid.ActualHeight > this.ActualHeight)
{
return;
}
var gen = list.ItemContainerGenerator;
if (gen != null)
{
var adjustOffset = 2; // small adjustment needed for alignment, adjust for your needs
var height = 0.0;
DependencyObject o;
for (var i = 0; i < n && (o = gen.ContainerFromIndex(i)) != null; i++)
{
var item = o as FrameworkElement;
if (item != null)
{
// calculate the offset of this item to its containing grid
var t = item.TransformToVisual(containingFixedGrid) as MatrixTransform;
if (t != null && t.Matrix.OffsetY + item.ActualHeight < containingFixedGrid.ActualHeight)
{
height += item.ActualHeight + adjustOffset;
}
}
}
// set height, unsub and resub to listeners otherwise endless layout cycle
if (height > 0)
{
list.SizeChanged -= List_OnSizeChanged;
list.Height = height;
list.SizeChanged += List_OnSizeChanged;
}
}
}
public static T FindVisualParent<T>(DependencyObject element) where T : DependencyObject
{
var parent = element;
while (parent != null)
{
T type = parent as T; if (type != null)
{
return type;
}
parent = VisualTreeHelper.GetParent(parent) as UIElement;
}
return null;
}订阅所需的列表到处理程序,现在每个列表中的项目数应该完全填充列表,而不需要裁剪任何项。调整adjustOffset以说明任何微小的差异。
https://stackoverflow.com/questions/20394306
复制相似问题