【问题标题】:In WPF, why doesn't a ListBox VirtualizingStackPanel work on Windows XP?在 WPF 中,为什么 ListBox VirtualizingStackPanel 在 Windows XP 上不起作用?
【发布时间】:2018-01-24 22:51:31
【问题描述】:

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

我的 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();
}

我的视图模型:

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 XP 的一个变体)上运行它时,列表框是空白的。使用常规 StackPanel 可以修复它,但我需要虚拟化。有谁知道该怎么做才能让它在 XP 上运行?

【问题讨论】:

    标签: c# wpf windows-xp-sp3


    【解决方案1】:

    ...这不是你如何使用VirtualizingStackPanel。您将每个人 TextBox 放在自己的 VirtualizingStackPanel 中。 ListBoxvirtualizing by default,所以你不需要做任何事情。

    MSDN:

    对于 ListBox,默认 ItemsPanelTemplate 指定 虚拟化堆栈面板。对于 MenuItem,默认使用 WrapPanel。为了 StatusBar,默认使用DockPanel。

    去掉那些额外的面板,看看它是否能再次在 XP 上运行。

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

    <ListBox>
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel IsVirtualizing="True" />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </LitBox>
    

    【讨论】:

    • 本文中的例子有错吗?:dzone.com/articles/virtualization-wpf
    • 代码看起来是正确的,但如果这是您尝试为您的 XAML 遵循的内容,那么您没有正确遵循它。
    • 查看该页面列表中的第 1 项。它还提到ListBox 是一个虚拟化控件。
    • 当我设置 ItemsPanel 和 ItemsPanelTemplate 时,我得到一个 XamlParseException:{“无法显式修改用作 ItemsControl 的 ItemsPanel 的 Panel 的 Children 集合。ItemsControl 为 Panel 生成子元素。”}
    • 您能否将导致该异常的 XAML 添加到您的问题中?
    猜你喜欢
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    相关资源
    最近更新 更多