出于性能原因,我需要在滚动列表框上使用虚拟化。
我的XAML:
<Grid>
<StackPanel>
<Button Content="Fill" Click="Button_Click" />
<ListBox ItemsSource="{Binding People}" ScrollViewer.CanContentScroll="True" VirtualizingStackPanel.IsVirtualizing="True">
<ListBox.ItemTemplate>
<DataTemplate>
<VirtualizingStackPanel>
<TextBox Text="{Binding FirstName}" />
</VirtualizingStackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</Grid>我的密码-背后:
public MainWindow()
{
InitializeComponent();
DataContext = _mainViewModel;
}
MainViewModel _mainViewModel = new MainViewModel();
private void Button_Click(object sender, RoutedEventArgs e)
{
_mainViewModel.FillPeople();
}我的ViewModel:
class MainViewModel : INotifyPropertyChanged
{
public ObservableCollection<Person> People { get; set; }
public MainViewModel()
{
People = new ObservableCollection<Person>();
}
public void FillPeople()
{
for (int i = 0; i < 100; i++)
{
var person = new Person { FirstName = "John" };
People.Add(person);
}
}
public event PropertyChangedEventHandler PropertyChanged;
}我的数据类:
class Person
{
public string FirstName { get; set; }
}当我在Windows 7和Windows 10上运行此代码时,列表会快速而正确地填写。当我在POSReady 2009 SP3 ( Windows的一个变体)上运行它时,列表框是空的。使用常规的StackPanel修复它,但我需要虚拟化。有人知道如何才能在XP上实现这个目标吗?
发布于 2017-08-16 17:44:13
.这不是你使用VirtualizingStackPanel的方式您正在将每个单独的TextBox放在自己的VirtualizingStackPanel中。不过,ListBox是默认虚拟化,所以您不需要做任何事情。
MSDN: 对于ListBox,默认ItemsPanelTemplate指定VirtualizingStackPanel。对于MenuItem,默认使用WrapPanel。对于StatusBar,默认使用DockPanel。
摆脱那些额外的面板,看看它是否再次开始在XP上工作。
让我们假设ListBox在默认情况下并没有虚拟化。使其虚拟化的正确方法如下(注意,我正在设置ItemsPanelTemplate,而不是ItemTemplate):
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel IsVirtualizing="True" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</LitBox>https://stackoverflow.com/questions/45719585
复制相似问题