MVVM,打开时等待光标"慢"页

时间:2017-11-21 11:05:51

标签: mvvm

我有多个页面的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(Im MVVM newbie)中做到这一点。我是否必须通过命令参数传递窗口引用并在命令中设置Wait cursor?如果我应该 - 我怎么能在XAML中做到这一点?

1 个答案:

答案 0 :(得分:1)

问题在于您要执行操作的线程与您的UI所在的线程相同。正是在这里,BackgroundWorker派上用场。

"BootstrapCol": {
        "prefix": "BSCol",
        "body": [
            "<div class="col-$1">$0</div><!-- ./col-{REPEAT WHAT IS BEING TYPED HERE} -->"
        ],
        "description": "Create a Bootstrap Grid col Markup"
    }

前一部分是宣言。现在您需要实现事件,但首先修改Read方法

BackgroundWorker bw = new BackgroundWorker();
bw.RunWorkerAsync += bw_DoWork;
bw.ProgressChanged += bw_ProgressChanged;
bw.RunWorkerCompleted += bw_WorkDone

既然逻辑放在另一个线程上,你可以使用progressChanged方法来做各种事情。就像显示进度条来报告状态一样,或者只是启用或禁用等待光标。

编辑:您无需将bw传递给用户界面。如果您正在使用MVVM(就像您应该和您正在做的那样),您可以利用绑定和事件,或者实现接口like this one。整个事情的关键在于UI只是“被告知”背景上正在发生的事情,避免冻结主线程。您只需要决定如何显示它。所以它可以是使用等待光标,也可以是实现进度条。

相关问题