【问题标题】:Data is coming to view at the end not step by step; How to use Dispatcher to switch between UI thread and render thread?数据最终不是一步一步来查看的;如何使用 Dispatcher 在 UI 线程和渲染线程之间切换?
【发布时间】:2019-04-11 06:25:38
【问题描述】:

我正在尝试使用 WPF 和 MVVM 的文本框构建状态栏,状态即将到来,但最终我希望它逐步到来。

我已经尝试过这段代码。 我还尝试在代码中提供Thread.Sleep(200);,但没有看到重大变化。 在 viewModel 中为 Status 创建一个属性

private string myStatus;
public string MyStatus  
{
  get { return myStatus; }
  set
  {
    myStatus = value;
    NotifyPropertyChanged("MyStatus");
  }
}

并初始化它

public void LoadData()
{
  MyStatus = "";
  for(int i=0;i<list.Count();i++)
  {
    switch(list.ElementAt(i))
    {
      case -1:
       MyStatus = "Negative value\n";
       //Thread.Sleep(200);
       break;
      case 0: 
       MyStatus = "value is zero\n";
       //Thread.Sleep(200);break;
      case 1:
       MyStatus = "Positive value\n";
       //Thread.Sleep(200);
       break;
    }
  }
}

并在视图中将其与属性绑定

<TextBox IsReadOnly="True" VerticalScrollBarVisibility="Visible"  Name="tbMultiline" Text="{Binding MyStatus}" />

文本框正在填充,但最后我希望它在每次循环迭代期间发生。 UI 会冻结一段时间,并在后端代码完成后恢复。搜了一下,了解了dispatcher,谁能告诉我如何在MVVM模式中使用dispatcher在UI线程和渲染线程之间切换。

【问题讨论】:

  • 这种情况发生得如此之快,以至于没有机会更新 UI,如果你想完成这项工作,你需要在每次调用之间暂停,以便 GUI 可以更新
  • 是否在 UI 线程上调用 LoadData?您可能必须将其放入后台线程并分派到 UI 以使其按您想要的方式更新。
  • 但是我可以很好地在控制台中看到这些状态。我写了 Console.WriteLine("status") 并且它一一出现@Denis
  • 我不这么认为@KevinCook,我不知道 WPF 中的 UI 线程。我是这里的新手。到目前为止,我还没有在这里使用过线程。
  • “一个接一个”是什么意思?他们必须或多或少地紧随其后,没有任何延迟

标签: wpf mvvm dispatcher


【解决方案1】:

希望我能准确理解您的问题。 您必须更改您的 xaml 端代码;

<TextBox IsReadOnly="True" VerticalScrollBarVisibility="Visible"  Name="tbMultiline" Text="{Binding MyStatus, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

【讨论】:

  • 感谢@Berkay 抽出宝贵时间。我希望我的文本框应该以渐进方式显示状态。每个状态都应该一一出现,不幸的是您的代码没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2012-08-18
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多