当Application.Current.Dispatcher.BeginInvoke代码后面没有显示wpf Busy Indicator

时间:2016-05-19 12:15:44

标签: wpf dispatcher busyindicator

我正在使用wpf busy指示符并从viewModel设置其Isbusy属性。我希望过滤Isbusy并在UI上推送ICollectionview财产取消Filter属性。我放入的IsBusy = true; await Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new System.Action(() => { this.MyCollectionView.Filter = item => { Iitem IdName = item as Iitem; return Regex.IsMatch(IdName.Name, SearchText, RegexOptions.IgnoreCase); }; })); 操作

Task.Delay(200).Wait();

解决方法:如果我在设置IsBusy后放置@EnableAutoConfiguration( exclude = { OAuth2RestOperationsConfiguration.class, ResourceServerTokenServicesConfiguration.class, ResourceServerTokenServicesConfiguration.class} ) ,则会在某些情况下显示忙碌指示符。

1 个答案:

答案 0 :(得分:0)

Filter始终在UI线程上运行,使其过于繁忙,无法实际更新UI以反映IsBusy状态。

在大多数情况下,Filter功能应该足够快,以至于他们不需要任何特殊处理。但是,如果您确定需要运行耗时的过滤器,那么最好的方法是拆分为两个不同的集合:MyCollection和{{ 1}}。然后,任何时候MyFilteredCollection(或过滤器)更改,执行以下操作:

MyCollection

(这假设IsBusy = true; var items = MyCollection.ToList(); var filter = SearchText; MyFilteredCollection = await Task.Run(() => items.Where(x => Regex.IsMatch(x.Name, filter, RegexOptions.IgnoreCase))); IsBusy = false; 会阻止IsBusyMyCollection发生变化。