这里有一个粗略的解决方案,我想实现你在找什么。我通过监听XAML中加载的事件来获取虚拟化堆栈面板。如果我在生产代码中这样做,我可能会将其分解为可重用的附加行为,而不是在代码隐藏中投入大量代码。
注意,确实没有我们可以用在这里找到屏幕上的孩子们的属性,所以我们来看看比较给孩子确定哪些孩子是在屏幕上父母的布局界限。 代码使用为获得一个项目的视觉孩子在视觉树的扩展方法,包含如下:
public static class MyVisualTreeHelpers
{
public static IEnumerable<FrameworkElement> GetChildren(this DependencyObject dependencyObject)
{
var numberOfChildren = VisualTreeHelper.GetChildrenCount(dependencyObject);
return (from index in Enumerable.Range(0, numberOfChildren)
select VisualTreeHelper.GetChild(dependencyObject, index)).Cast<FrameworkElement>();
}
}
此代码是用我测试了这一点的目的,创造了一个非常基本的视图模型的层次结构。我会将它只是在情况下,它有助于理解其他代码:
public class MyViewModel
{
public MyViewModel()
{
Children = new ObservableCollection<ChildViewModel>(GenerateChildren());
}
public ObservableCollection<ChildViewModel> Children { get; set; }
private static IEnumerable<ChildViewModel> GenerateChildren()
{
return from value in Enumerable.Range(1, 1000)
select new ChildViewModel {Value = value};
}
}
public class ChildViewModel
{
public int Value { get; set; }
}
XAML:
<Window x:Class="WpfTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfTest="clr-namespace:WpfTest"
Title="MainWindow" Height="500" Width="500">
<ListBox ItemsSource="{Binding Children}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Loaded="OnPanelLoaded" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate DataType="wpfTest:ChildViewModel">
<TextBlock Text="{Binding Value}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Window>
谢谢Tim,这是一个很好的答案。我其实只是从VirtualizingStackPanel继承而来,并将代码移到那里。然后浇铸孩子以键入IDisposable,所以现在我需要做的是在我的虚拟机上实现IDisposable以使其工作。 – Charlie