加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows-phone-8 – 从便携式类库更新UI线程

发布时间:2020-12-13 20:36:09 所属栏目:Windows 来源:网络整理
导读:我有一个在Windows Phone 8上运行的MVVM Cross应用程序,我最近将其移植到使用可移植类库. 视图模型位于可移植类库中,其中一个公开了一个属性,该属性通过数据绑定从Silverlight for WP工具包启用和禁用PerformanceProgressBar. 当用户按下按钮时,RelayCommand
我有一个在Windows Phone 8上运行的MVVM Cross应用程序,我最近将其移植到使用可移植类库.

视图模型位于可移植类库中,其中一个公开了一个属性,该属性通过数据绑定从Silverlight for WP工具包启用和禁用PerformanceProgressBar.

当用户按下按钮时,RelayCommand启动后台进程,该进程将属性设置为true,这将启用进度条并执行后台处理.

在将其移植到PCL之前,我能够从UI线程调用更改以确保启用了进度条,但是在PCL中无法使用Dispatcher对象.我该如何解决这个问题?

谢谢

如果您无权访问Dispatcher,则只需将BeginInvoke方法的委托传递给您的类:
public class YourViewModel
{
    public YourViewModel(Action<Action> beginInvoke)
    {
        this.BeginInvoke = beginInvoke;
    }

    protected Action<Action> BeginInvoke { get; private set; }

    private void SomeMethod()
    {
        this.BeginInvoke(() => DoSomething());
    }
}

然后实例化(来自可以访问调度程序的类):

var dispatcherDelegate = action => Dispatcher.BeginInvoke(action);

var viewModel = new YourViewModel(dispatcherDelegate);

或者您也可以在调度程序周围创建一个包装器.

首先,在可移植类库中定义IDispatcher接口:

public interface IDispatcher
{
    void BeginInvoke(Action action);
}

然后,在有权访问调度程序的项目中,实现接口:

public class DispatcherWrapper : IDispatcher
{
    public DispatcherWrapper(Dispatcher dispatcher)
    {
        this.Dispatcher = dispatcher;
    }

    protected Dispatcher Dispatcher { get; private set; }

    public void BeginInvoke(Action action)
    {
        this.Dispatcher.BeginInvoke(action);
    }
}

然后,您可以将此对象作为IDispatcher实例传递给可移植类库.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读