【问题标题】:wpf Busy Indicator is not showing up when followed by Application.Current.Dispatcher.BeginInvoke code当 Application.Current.Dispatcher.BeginInvoke 代码后跟 wpf Busy Indicator 时未显示
【发布时间】:2016-09-16 07:36:06
【问题描述】:

我正在使用 wpf 繁忙指示器并从 viewModel 设置其 Isbusy 属性。在设置 Isbusy 属性后,我想过滤我的 ICollectionview 并将其推送到 UI 上。这个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);
      };
    }));

解决方法:如果我在设置IsBusy 之后加上Task.Delay(200).Wait();,在某些情况下会显示忙碌指示符。

【问题讨论】:

  • 这个
    在 WPF 中表示什么?

标签: wpf dispatcher busyindicator


【解决方案1】:

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

在大多数情况下,Filter 函数应该运行得足够快,以至于它们不需要任何特殊处理。但是,如果您确定需要运行一个耗时的过滤器,那么最好的方法是拆分为两个不同 集合:MyCollectionMyFilteredCollection。然后,每当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;

(假设IsBusy 将阻止MyCollectionSearchText 更改)。

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 2011-10-29
    • 1970-01-01
    • 2019-11-27
    • 2019-07-07
    • 2018-12-04
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多