0
私はuiアップデートの問題に遭遇しました。私は機能を実行できるようにしたい、機能の内側に長い時間がかかるコールBがあるので、機能Aの実行は、私がProgressViewにビューを変更したい関数Bに来たとき、およびshowオンザフライで進歩する。MVVMでアクションを実行する前にUIを強制的に更新する方法はありますか?
何私が達成したい:Aの
- コール機能Bは、ProgressDialogを開き、 機能Aながら進行状況を表示処理するのを待っている
- ファンクションBが終了する
- 機能Aを続けることができ3210機能Aは私がUIを更新したい場合、私はUIスレッド上でアクションを実行するアプリケーションディスパッチャを使用する必要があることが分かった
終了します。
関数B:
Public Sub ShowWaitingScreen(workItems As List(Of WorkItem)) Implements IViewsLogic.ShowWaitingScreen
Dim waiting As WaitingDialogViewModel = New WaitingDialogViewModel(workItems, Sub() HideDialog())
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, Sub()
_shell.DialogViewModel = waiting
waiting.StartWorker
End Sub)
End Sub
Public Class WaitingDialogViewModel
Inherits ViewModelBase
Implements IDialog
Public Sub New(workItems As List(Of WorkItem), completeAction As Action)
_completeAction = completeAction
_workItems = workItems
ProgressValue = 0
StatusMessage = "Preparing"
End Sub
'Private WithEvents _worker As BackgroundWorker
Private _completeAction As Action
Private _progressValue As Integer
Private _statusMessage As String
Private ReadOnly _workItems As List(Of WorkItem)
Public Property ProgressValue As Integer
Get
Return _progressValue
End Get
Set(value As Integer)
_progressValue = value
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, Sub()
RaisePropertyChanged(Function() ProgressValue)
End Sub)
End Set
End Property
Public Sub StartWorker()
For i As Integer = 1 To _workItems.Count()
ReportProgress(Convert.ToInt32(Math.Ceiling(100/(i + 1))), "Executing " + i.ToString() + " out of " + _workItems.Count().ToString())
_workItems(i - 1).WorkerAction.Invoke()
Next
ReportProgress(100, "Dome")
_completeAction.Invoke()
End Sub
Public Property StatusMessage As String
Get
Return _statusMessage
End Get
Set(value As String)
_statusMessage = value
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, Sub()
RaisePropertyChanged(Function() StatusMessage)
End Sub)
End Set
End Property
Private Sub ReportProgress(progress As Integer, text As String)
ProgressValue = progress
StatusMessage = text
End Sub
End Class
私が今直面しています問題は、時々WaitingDialogViewModelが示され、結果が矛盾していることを、時にはそのではありません。進行状況の実行を開始する前にUIの更新を強制するにはどうすればよいですか?