C# 请参见WPF列表视图逐个添加项目1,而不是一次添加所有项目

C# 请参见WPF列表视图逐个添加项目1,而不是一次添加所有项目,c#,wpf,C#,Wpf,我花了很长时间进行实验和谷歌搜索,但至今没有找到答案 我有一个WPF列表视图,它使用WrapPanel作为它的items容器 出于各种原因,我不想虚拟化包装面板 在值转换器中完成时,是否可以逐个显示正在添加的项目?这样用户在加载项目时不会看到空白屏幕?这是一种非常常见的情况,所以我很惊讶您在搜索过程中没有找到任何东西。也许如果你用“异步”这个词,你会有更多的运气。无论哪种方式,答案都是使用 简而言之,您可以将任务添加到UI Dispatcher对象的消息队列中,以便它可以异步运行它们。网上有很多

我花了很长时间进行实验和谷歌搜索,但至今没有找到答案

我有一个WPF列表视图,它使用WrapPanel作为它的items容器

出于各种原因,我不想虚拟化包装面板


在值转换器中完成时,是否可以逐个显示正在添加的项目?这样用户在加载项目时不会看到空白屏幕?

这是一种非常常见的情况,所以我很惊讶您在搜索过程中没有找到任何东西。也许如果你用“异步”这个词,你会有更多的运气。无论哪种方式,答案都是使用

简而言之,您可以将任务添加到UI Dispatcher对象的消息队列中,以便它可以异步运行它们。网上有很多这样的例子,但我在Java2s网站的页面上找到了一个:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WPF" Height="200" Width="300"
    Loaded="Window_Loaded">

    <Window.Resources>
        <DataTemplate x:Key="ListItemTemplate">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding}" VerticalAlignment="Center"/>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <StackPanel>
        <ListBox x:Name="listBox" ItemTemplate= "{StaticResource ListItemTemplate}"/>
    </StackPanel>
</Window>

//File:Window.xaml.cs

using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Threading;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        private ObservableCollection<string> numberDescriptions;

        public Window1()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            numberDescriptions = new ObservableCollection<string>();

            listBox.ItemsSource = numberDescriptions;

            this.Dispatcher.BeginInvoke(DispatcherPriority.Background,new LoadNumberDelegate(LoadNumber), 1);
        }
        private delegate void LoadNumberDelegate(int number);

        private void LoadNumber(int number)
        {
            numberDescriptions.Add("Number " + number.ToString());
            this.Dispatcher.BeginInvoke(DispatcherPriority.Background,new LoadNumberDelegate(LoadNumber), ++number);
        }
    }
}

我对答案也很感兴趣。非常有趣+1是否有解决此问题的MVVM解决方案?您需要将调度程序的引用从UI Dispatcher.CurrentDispatcher传递到视图模型。