0

我从 WPF 扩展工具包中填充 aa DataGridControl,并在用户选择时填充 DataTables。当用户选择被修改时,不仅显示具有 200 x 1000 行的 DataTable 会有很大的延迟,而且还会存在阻止用户与其他控件交互的用户交互延迟,即使绑定到的 DataTable 的填充DataGridControl发生在一个单独的线程。

如何消除延迟,以便用户可以在 DataGridControl 更新时与视图中的其他控件进行交互?

    public string ListBoxSelection {
                get { 
                    return listBoxSelection;
                }
                set {
                    listBoxSelection = value;
                    OnPropertyChanged("ListBoxSelection"); //  DataGridSelection

                    BackgroundWorker threadPreviewLoader = new BackgroundWorker();
                    threadPreviewLoader.DoWork += (LoadDataGridPreview); 
                    threadPreviewLoader.RunWorkerAsync();
                }
            }

    private DataTable dTPreviewWindow; //modified in thread 

    public DataView dvLbSelection {
            get {
                return dTPreviewWindow.DefaultView;  //DataGridControl binding 
            }
        }

private void LoadDataGridPreview(object sender, DoWorkEventArgs e) {

            if (listBoxSelection != null) {
                try {
                    DataTable testImmediateChange = new DataTable();
                    testImmediateChange = DataSetModel.ChunkFlatFile(listBoxSelection, 1, PREVIEW_WINDOW_MAX_ROWS); //labor itensive work 
                    dTPreviewWindow = testImmediateChange;
                    fileOpenGood = true;
                } catch {

                    fileOpenText = DATAGRID_TEXT_BADFILE;
                    fileOpenGood = false;


                }
                fileOpenText = DATAGRID_TEXT_NOFILECHOSEN;

                OnPropertyChanged("FileOpenGood");
                OnPropertyChanged("FileOpenBad");
                OnPropertyChanged("FileOpenText");
                OnPropertyChanged("dvLbSelection");
            } else {
                ValidatePreviewWindow(true);
            }
        }
4

1 回答 1

0

如果您的数据视图(即 dvLbSelection)是 UI 绑定的,即使在后台线程中更新它也会导致 UI 刷新。当用户尝试与其他控件交互时,这反过来会导致延迟。所以在这里你可以尝试几件事。

  1. 断开数据视图与 UI 的连接,直到加载所有数据。(使用临时变量加载后台线程中的值)
  2. 在数据网格上使用虚拟化并设置 VirtualizingStackPanel.VirtualizationMode ="Recycling"
  3. 避免创建多个后台线程(根据提供的代码片段,为每个 ListBox Selection 创建一个新线程)。使用多线程运行昂贵的操作将是延迟的主要原因之一。

希望这可以帮助!

于 2013-02-20T22:58:06.397 回答