我有多页的MVVM应用程序。我的所有页面都绑定了ReadCommand():
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding ReadCommand}" CommandParameter="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>这是我在ViewModel中的Read()命令:
private void Read(object parameter)
{
HwDevice Device = new HwDevice();
this.Alarms = Device.Alarms; // this is slow (reading data from RS232 device)
Device.Dispose();
}有一个页面的数据源很慢,当这个页面被加载时(大约5秒),我的应用程序被冻结。
我想在整个窗口上设置等待光标,但我不知道如何在MVVM (我是MVVM新手)中这样做。我是否必须通过命令参数传递窗口引用,并在命令中设置等待光标?如果我应该-我如何在XAML中做呢?
发布于 2017-11-21 19:52:06
问题是,您要执行操作的线程与您的UI所在的线程是相同的。正是在这里,BackgroundWorker派上了用场。
BackgroundWorker bw = new BackgroundWorker();
bw.RunWorkerAsync += bw_DoWork;
bw.ProgressChanged += bw_ProgressChanged;
bw.RunWorkerCompleted += bw_WorkDone前面的部分是声明。现在您需要实现事件,但首先要修改Read方法
private void Read(object parameter)
{
bw.RunWorkerAsync(parameter);
// put your logic here
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
object parameter = e.Argument;
}现在逻辑被放在另一个线程上,您可以使用progressChanged方法来做各种事情。比如显示进度条来报告状态,或者简单地启用或禁用等待光标。
编辑:您不需要将bw传递给UI。如果你正在使用MVVM (就像你应该做的那样),你可以使用绑定和事件,或者实现一个接口like this one。整个事情的要点是,UI只是“通知”后台正在发生的事情,避免冻结主线程。你只需要决定如何显示它。因此,它既可以使用等待光标,也可以实现进度条。
https://stackoverflow.com/questions/47411555
复制相似问题