【问题标题】:Show Splash Screen & Progress Bar with Percentage using MVVM & WPF使用 MVVM 和 WPF 显示带有百分比的启动画面和进度条
【发布时间】:2012-06-04 21:33:31
【问题描述】:

我需要显示带有图像和进度条的启动画面。

  1. 在我的应用程序启动中,我有如下代码来显示主窗口。

         SplashScreenWindowViewModel vm = new SplashScreenWindowViewModel(); 
         AutoResetEvent ev = new AutoResetEvent(false); 
          Thread uiThread = new Thread(() =>
         {
            vm.Dispatcher = Dispatcher.CurrentDispatcher;
            ev.Set();
    
            Dispatcher.CurrentDispatcher.BeginInvoke((Action)delegate()
            {
                SplashScreenWindow splashScreenWindow = new SplashScreenWindow();
                splashScreenWindow = new SplashScreenWindow();
                splashScreenWindow.Show();
                splashScreenWindow.DataContext = vm;
                vm.InstigateWorkCommand.Execute(null);
    
            });
    
            Dispatcher.Run();
        });
          uiThread.SetApartmentState(ApartmentState.STA);
          uiThread.IsBackground = true;
          uiThread.Start();
          ev.WaitOne();
    
  2. 在我的主视图模型中,我的代码如下

    类 MainviewModel : viewmodelbase { 派生字符串_message; 私有对象内容; 私有只读 BackgroundWorker 工作者; 私有只读 ICommand instigateWorkCommand;

        public SplashScreenWindowViewModel()
        {
    
            this.instigateWorkCommand = new
             RelayCommand(() => this.worker.RunWorkerAsync(), () => !this.worker.IsBusy);
            this.worker = new BackgroundWorker { WorkerReportsProgress = true };           
            this.worker.DoWork += this.DoWork;
            this.worker.ProgressChanged += this.ProgressChanged;
            _message = "0 % completed";
    
        }
    
    
    
        public ICommand InstigateWorkCommand
        {
    
            get { return this.instigateWorkCommand; }
        }
    
        private double _currentProgress;
        public double CurrentProgress        
        {
            get { return this._currentProgress; }
            set
            {
                if (this._currentProgress != value)
                {
    
                    this._currentProgress = value;                   
                    RaisePropertyChanged("CurrentProgress");
                }
            }
        }
        private int _progressMax;
        public int ProgressMax
        {
            get { return this._progressMax; }
    
            set
            {
                if(this._progressMax != value)
                {
                  this._progressMax = value;
                  RaisePropertyChanged("ProgressMax");
                }
    
            }
        }
    
        private void ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
          this.CurrentProgress = e.ProgressPercentage;
    
    
        }
    
        private void DoWork(object sender, DoWorkEventArgs e)
        {
    
           // calling my long running operation
           DAL.dotimeconsumingcode();
           worker.ReportProgress((int)e.argument);
    
        }
    
    
    
    
        public string Message
        {
            get
            {
                return _message;
            }
            set
            {
                if (Message == value) return;
                _message = value;
                RaisePropertyChanged("Message");
            }
        }
    
    
        public object Content
        {
            get
            {
                return content;
            }
            set
            {
                if (Content == value) return;
                content = value;
    
                RaisePropertyChanged("Content");
            }
        }
    
        public Dispatcher Dispatcher
        {
            get;
            set;
        }
    

    }

    我的 UI 有一个带有进度条的用户控件和一个启动主窗口。 当我长时间运行的操作完成时,我的主窗口(主应用程序)被打开。 //用户控制

            <ProgressBar Height="27" Value="{Binding CurrentProgress, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"  Margin="53,162,57,0" Name="progressBar"  Grid.Row="1"
                 Maximum="{Binding Path=ProgressMax, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"    Visibility="{Binding ProgressVisibility}"  />
    

    //启动窗口

      <localView:usercontrol/>
    

我的问题是

ProgressChangedevent 没有触发,% 完成也没有显示在文本块中。请帮忙

【问题讨论】:

    标签: wpf c#-4.0 mvvm-light


    【解决方案1】:

    您尚未注册完整的处理程序,并且您没有正确调用进度。 这个来自 MSDN 的示例涵盖了所有内容。

    BackGroundWorker

    【讨论】:

    • 嗨,Blam 在我的 mainviewmodel 构造函数中,我已为所有事件处理程序注册。唯一缺少的是 backgroundWorker1_RunWorkerCompleted。完成了,但没有进展。
    • 不清楚。如此完整的工作?你解决了进步的呼吁吗?请使用当前代码更新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多