翻譯|使用教程|編輯:龔雪|2023-01-30 09:56:58.307|閱讀 154 次
概述:本文將為大家介紹DevExpress WPF的TreeList控件時如何實現異步加載節點,歡迎下載新版控件升級您的主題~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
DevExpress WPF擁有120+個控件和庫,將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序,這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。
在本文中,我們將詳細介紹如何在DevExpress WPF TreeList控件和WPF Data Grid的TreeListView中異步加載樹節點。
DevExpress技術交流群7:674691612 歡迎一起進群討論
當從一個服務中獲取數據或加載一個有很多子記錄的節點時,應用程序可能會在節點擴展期間暫時“凍結”,為了解決這個問題現在可以在后臺線程中加載子節點。啟用此選項后,應用程序UI將在加載/展開操作期間保持響應。
當加載信息時,WPF TreeList控件將在屏幕上顯示等待指示器。一旦完成,節點將被展開,等待指示器將被隱藏。
要在下一個WPF項目中引入此功能,請創建一個實現iasyncchildnodeselector接口的類,并重寫SelectChildrenAsync方法。當用戶展開節點并允許開發人員在后臺線程中加載子節點時,選擇器將調用此方法,該方法返回一個Task對象(其中包含加載的子記錄的集合):
public class AsyncChildrenSelector : IAsyncChildNodesSelector { public Task<bool> HasChildNode(object item, CancellationToken token) { throw new NotImplementedException(); } public IEnumerable SelectChildren(object item) { throw new NotImplementedException(); } public Task<IEnumerable> SelectChildrenAsync(object item, CancellationToken token) { return Task.Run(async () => { await Task.Delay(1000); return SelectChildNodes(item); }); } public IEnumerable SelectChildNodes(object item) { if (item is ProjectStage) return (item as ProjectStage).StageTasks; else if (item is ProjectObject) return (item as ProjectObject).ProjectStages; return null; } }
接下來,重寫方法來檢查加載的節點是否有子節點。當加載所有子節點時,選擇器調用此方法。該方法返回一個對象,該對象包含一個布爾值(指示加載的節點是否包含子節點)。基于這個值,WPF TreeList控件顯示節點的展開按鈕:
public class AsyncChildrenSelector : IAsyncChildNodesSelector { public Task<bool> HasChildNode(object item, CancellationToken token) { return Task.Run(async () => { await Task.Delay(250); return !(item is StageTask); }); } public IEnumerable SelectChildren(object item) { throw new NotImplementedException(); } public Task<IEnumerable> SelectChildrenAsync(object item, CancellationToken token) { return Task.Run(async () => { await Task.Delay(1000); return SelectChildNodes(item); }); } public IEnumerable SelectChildNodes(object item) { if (item is ProjectStage) return (item as ProjectStage).StageTasks; else if (item is ProjectObject) return (item as ProjectObject).ProjectStages; return null; } }
開發人員可以允許最終用戶取消任何加載操作,為了響應用戶的取消請求而取消加載操作,調用或方法中的方法。如果實現了,WPF TreeList控件將在用戶取消加載操作時顯示一個重試按鈕。這個“refresh”按鈕允許用戶重新啟動操作:
public class CustomChildrenSelector : IAsyncChildNodesSelector { public Task<bool> HasChildNode(object item, CancellationToken token) { return Task.Run(async () => { for (int i = 0; i < 10; i++) { token.ThrowIfCancellationRequested(); await Task.Delay(25); } return !(item is StageTask); }); } public IEnumerable SelectChildren(object item) { throw new NotImplementedException(); } public Task<IEnumerable> SelectChildrenAsync(object item, CancellationToken token) { return Task.Run(async () => { for (int i = 0; i < 10; i++) { token.ThrowIfCancellationRequested(); await Task.Delay(100); } return SelectChildNodes(item); }); } public IEnumerable SelectChildNodes(object item) { if (item is ProjectStage) return (item as ProjectStage).Tasks; else if (item is ProjectObject) return (item as ProjectObject).Stages; return null; } }
將屬性設置為ChildNodesSelector,然后將創建的類實例分配給屬性:
<dxg:TreeListControl ...> <dxg:TreeListControl.Resources> <local:AsyncChildrenSelector x:Key="childrenSelector"/> </dxg:TreeListControl.Resources> <dxg:TreeListControl.View> <dxg:TreeListView TreeDerivationMode="ChildNodesSelector" ChildNodesSelector="{StaticResource childrenSelector}"/> </dxg:TreeListControl.View> </dxg:TreeListControl>
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網