Ich versuche, ein UserControl wiederzuverwenden und auch einige Logiken auszuleihen, die den Fortschritt verfolgen. Ich werde versuchen, die Dinge zu vereinfachen. MyWindow.xaml enthält ein MyUserControl. MyUserControl hat seinen eigenen Fortschrittsanzeiger (Formatierung läuft..., Dateien werden kopiert..., etc.) und ich möchte diesen Fortschritt irgendwo im MyWindow-Formular spiegeln. Aber das Benutzersteuerelement hat einige Logiken, die ich nicht ganz verstehe. Ich habe gelesen und gelesen, aber ich verstehe den Dispatcher immer noch nicht. Hier ist eine Zusammenfassung der Logik im Benutzersteuerelement, die den Fortschritt aktualisiert.
this.Dispatcher.Invoke(DispatcherPriority.Input, (Action)(() =>
{
DAProgressIndicator = InfiniteProgress.AddNewInstanceToControl(StatusGrid, new SolidColorBrush(new Color() { A = 170, R = 128, G = 128, B = 128 }), string.Empty);
DAProgressIndicator.Message = MediaCardAdminRes.ActivatingCard;
ActivateInProgress = true;
}));
Ich dachte, ich wäre klug und würde ein Ereignis zu MyUserControl hinzufügen, das in der Logik des ActivateInProgress-Eigenschaftssatzes aufgerufen würde.
public bool ActivateInProgress
{
get
{
return _activateInProgress;
}
set
{
_activateInProgress = value;
if (ActivateInProgressHandler != null)
{
ActivateInProgressHandler(value);
}
}
}
Ich setze den ActivateInProgressHandler im MyWindow-Konstruktor auf die folgende Methode, die die Eigenschaft des ViewModel setzt, die für den eigenen Fortschrittsanzeiger des Fensters verwendet wird.
private void SetActivation(bool activateInProgress)
{
viewModel.ActivationInProgress = activateInProgress;
}
Der Fortschrittsanzeiger des Fensters ändert sich jedoch nie. Deshalb bin ich überzeugt, dass der Dispatcher.Invoke etwas tut, das ich nicht verstehe. Wenn ich eine MessageBox in die SetActivation-Methode setze, blockiert der Thread und der Fortschrittsanzeiger des Fensters wird aktualisiert. Ich verstehe grundlegende Threads, aber dieses ganze Dispatcher-Ding ist neu für mich. Was fehlt mir?
UPDATE: Es scheint jetzt zu funktionieren. Es stellte sich heraus, dass der Fortschritt so schnell aktualisiert wurde, dass er nie auf dem Bildschirm angezeigt wurde. Aber ich würde immer noch gerne verstehen, warum der Dispatcher.Invoke durchgeführt wurde (dies war vorhandener Code, den ich nicht geschrieben habe). Warum werden die Inhalte der Aktion nicht direkt mit dem Rest des *.xaml.cs-Codes ausgeführt?