画像と進行状況バーを含むスプラッシュ スクリーンを表示する必要があります。
アプリケーションの起動時に、メイン ウィンドウを表示するコードを以下に示します。
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();
私のメインビューモデルには、以下のようなコードがあります
class MainviewModel : viewmodelbase { rivate string _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; }
}
MY UI には、進行状況バーを備えた 1 つのユーザー コントロールと 1 つのスプラッシュ メイン ウィンドウがあります。長時間実行されている操作が完了すると、メイン ウィンドウ (メイン アプリケーション) が開きます。//ユーザーコントロール
<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}" />
//SplashWindow
<localView:usercontrol/>
私の問題は
ProgressChangedevent は発生せず、% 完了もテキスト ブロックに表示されません。助けてください