翻譯|使用教程|編輯:龔雪|2023-01-30 09:56:58.307|閱讀 154 次
概述:本文將為大家介紹DevExpress WPF的TreeList控件時(shí)如何實(shí)現(xiàn)異步加載節(jié)點(diǎn),歡迎下載新版控件升級(jí)您的主題~
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
DevExpress WPF擁有120+個(gè)控件和庫,將幫助您交付滿足甚至超出企業(yè)需求的高性能業(yè)務(wù)應(yīng)用程序。通過DevExpress WPF能創(chuàng)建有著強(qiáng)大互動(dòng)功能的XAML基礎(chǔ)應(yīng)用程序,這些應(yīng)用程序?qū)W⒂诋?dāng)代客戶的需求和構(gòu)建未來新一代支持觸摸的解決方案。
在本文中,我們將詳細(xì)介紹如何在DevExpress WPF TreeList控件和WPF Data Grid的TreeListView中異步加載樹節(jié)點(diǎn)。
DevExpress技術(shù)交流群7:674691612 歡迎一起進(jìn)群討論
當(dāng)從一個(gè)服務(wù)中獲取數(shù)據(jù)或加載一個(gè)有很多子記錄的節(jié)點(diǎn)時(shí),應(yīng)用程序可能會(huì)在節(jié)點(diǎn)擴(kuò)展期間暫時(shí)“凍結(jié)”,為了解決這個(gè)問題現(xiàn)在可以在后臺(tái)線程中加載子節(jié)點(diǎn)。啟用此選項(xiàng)后,應(yīng)用程序UI將在加載/展開操作期間保持響應(yīng)。
當(dāng)加載信息時(shí),WPF TreeList控件將在屏幕上顯示等待指示器。一旦完成,節(jié)點(diǎn)將被展開,等待指示器將被隱藏。
要在下一個(gè)WPF項(xiàng)目中引入此功能,請(qǐng)創(chuàng)建一個(gè)實(shí)現(xiàn)iasyncchildnodeselector接口的類,并重寫SelectChildrenAsync方法。當(dāng)用戶展開節(jié)點(diǎn)并允許開發(fā)人員在后臺(tái)線程中加載子節(jié)點(diǎn)時(shí),選擇器將調(diào)用此方法,該方法返回一個(gè)Task對(duì)象(其中包含加載的子記錄的集合):
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; } }
接下來,重寫方法來檢查加載的節(jié)點(diǎn)是否有子節(jié)點(diǎn)。當(dāng)加載所有子節(jié)點(diǎn)時(shí),選擇器調(diào)用此方法。該方法返回一個(gè)對(duì)象,該對(duì)象包含一個(gè)布爾值(指示加載的節(jié)點(diǎn)是否包含子節(jié)點(diǎn))。基于這個(gè)值,WPF TreeList控件顯示節(jié)點(diǎn)的展開按鈕:
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; } }
開發(fā)人員可以允許最終用戶取消任何加載操作,為了響應(yīng)用戶的取消請(qǐng)求而取消加載操作,調(diào)用或方法中的方法。如果實(shí)現(xiàn)了,WPF TreeList控件將在用戶取消加載操作時(shí)顯示一個(gè)重試按鈕。這個(gè)“refresh”按鈕允許用戶重新啟動(dòng)操作:
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; } }
將屬性設(shè)置為ChildNodesSelector,然后將創(chuàng)建的類實(shí)例分配給屬性:
<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>
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)