首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WPF中,为什么ListBox VirtualizingStackPanel不能在Windows上工作?

在WPF中,为什么ListBox VirtualizingStackPanel不能在Windows上工作?
EN

Stack Overflow用户
提问于 2017-08-16 17:21:21
回答 1查看 1.6K关注 0票数 0

出于性能原因,我需要在滚动列表框上使用虚拟化。

我的XAML:

代码语言:javascript
复制
<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>

我的密码-背后:

代码语言:javascript
复制
public MainWindow()
{
    InitializeComponent();

    DataContext = _mainViewModel;
}

MainViewModel _mainViewModel = new MainViewModel();

private void Button_Click(object sender, RoutedEventArgs e)
{
    _mainViewModel.FillPeople();
}

我的ViewModel:

代码语言:javascript
复制
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;
}

我的数据类:

代码语言:javascript
复制
class Person
{
    public string FirstName { get; set; }
}

当我在Windows 7和Windows 10上运行此代码时,列表会快速而正确地填写。当我在POSReady 2009 SP3 ( Windows的一个变体)上运行它时,列表框是空的。使用常规的StackPanel修复它,但我需要虚拟化。有人知道如何才能在XP上实现这个目标吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-16 17:44:13

.这不是你使用VirtualizingStackPanel的方式您正在将每个单独的TextBox放在自己的VirtualizingStackPanel中。不过,ListBox默认虚拟化,所以您不需要做任何事情。

MSDN: 对于ListBox,默认ItemsPanelTemplate指定VirtualizingStackPanel。对于MenuItem,默认使用WrapPanel。对于StatusBar,默认使用DockPanel。

摆脱那些额外的面板,看看它是否再次开始在XP上工作。

让我们假设ListBox在默认情况下并没有虚拟化。使其虚拟化的正确方法如下(注意,我正在设置ItemsPanelTemplate,而不是ItemTemplate):

代码语言:javascript
复制
<ListBox>
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel IsVirtualizing="True" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</LitBox>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45719585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档