WPF prism框架下的等待加载动画 (IEventAggregator INavigationAware)

1.创建事件UpdateLoadingEvent

继承PubSubEvent类,并传入一个对象泛型

PubSubEvent:维护订阅者列表并向订阅者发送事件。

public class UpdateModel {
        public bool IsOpen { get; set; }
    }
  
    class UpdateLoadingEvent : PubSubEvent<UpdateModel>
    {

    }

 2.创建订阅和发布类

通过构造注入IEventAggregator,并通过IEventAggregator的GetEvent获取定义的消息,再通过Subscribe方法注册;UpdateModel动态地获取前台传过来的值

转载:EventAggregator 是基于事件聚合器服务,允许发布者和订阅者之间通过事件进行通讯,且彼此之间没有直接引用。

public static class DialogExtensions
    {
        public static void Resgiter(this IEventAggregator aggregator, Action<UpdateModel> action)
        {//订阅;Subscribe是一个委托方法
            aggregator.GetEvent<UpdateLoadingEvent>().Subscribe(action);
        }

    public static void UpdateLoading(this IEventAggregator aggregator, UpdateModel model)
        {//发布
            aggregator.GetEvent<UpdateLoadingEvent>().Publish(model);
        }

}

 3.动画view

<StackPanel Width="100">
            <ProgressBar Width="40" Height="40" Margin="20"
                         IsIndeterminate="True"

                //MaterialDesignThemes下的样式,需在包管理器下安装
                         Style="{StaticResource MaterialDesignCircularProgressBar}"
                         />
 </StackPanel>

4.实现目标view的下订阅

  public MainView(IEventAggregator aggregator)
        {
            InitializeComponent();
            aggregator.Resgiter(arg =>
            {//在目标view中根组件x:names=“DialogHost”
                DialogHost.IsOpen = arg.IsOpen;

                if (DialogHost.IsOpen)
                    DialogHost.DialogContent = new ProgressView();
            });

}

5.实现目标viewmodel继承的基类

(因为要进行页面的跳转,而目标viewmodel不能同时有两个基类)

INavigationAware:页面时导入参数

IContainerProvider :抽象第三方IOC框架从容器中拿对象

public class NavigationViewModel : BindableBase, INavigationAware
    {
        private readonly IContainerProvider containerProvider;
        private readonly IEventAggregator aggregator;


        public  NavigationViewModel(IContainerProvider containerProvider)
        {
            this.containerProvider = containerProvider;
            aggregator = containerProvider.Resolve<IEventAggregator>();
        }
        public virtual bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

        public virtual void OnNavigatedFrom(NavigationContext navigationContext)
        {  }

        public virtual void OnNavigatedTo(NavigationContext navigationContext)
        {  }
        public void UpdateLoading(bool IsOpen)
        {//更新指定的模型实例
            aggregator.UpdateLoading(new Common.Events.UpdateModel()
            {
                IsOpen = IsOpen
            });
        }
    }

6.实现目标viewmodel

 public  class AViewModel: NavigationViewModel{

  public AViewModel(IContainerProvider provider)
            : base(provider)

        {

                     GetDataAsync();

                }

   async void GetDataAsync()
        {
            UpdateLoading(true);

           ///数据导入代码(省略)
            UpdateLoading(false);
        }

        public override void OnNavigatedTo(NavigationContext navigationContext)
        {
            base.OnNavigatedTo(navigationContext);

            GetDataAsync();
        }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值