none
WPF: Tab wird nicht geöffnet, wenn der Befehl zum Öffnen aus dem Event-Thread kommt RRS feed

  • Frage

  • Hallo allerseits,

    ich stelle Tabs in einem TabControl dar:

    <TabControl x:Name="tabContainer" Grid.Column="0" Margin="5">
    <!-- ... -->
    </TabControl>

    Um MVVM nutzen zu können, binde ich die ItemsSource des TabControl an eine ObservableCollection:

    var tabs = new ObservableCollection<CloseableTabItem>();
    tabContainer.ItemsSource = tabs;

    Ein Tab wird wie folgt hinzugefügt:

    public int AddTab(string title, UserControl content) { CloseableTabItem item = new CloseableTabItem(title, content); tabs.Add(item); }

    Das funktioniert auch alles soweit: nach dem Aufruf von AddTab wird das neue Tab angezeigt.

    Bis auf eine Ausnahme: ich benutze in meiner Applikation MS Word. Dabei starte ich Word mittels Office Interop und "lausche" auf das Schließen von Word. Wurde Word geschlossen, wird ein Tab geöffnet:

    DocumentEvents_Event docEvents = (Microsoft.Office.Interop.Word.DocumentEvents_Event)_doc; docEvents.Close += OnClose; private void OnClose() { var title = ... var content = ... // Öffne ein Tab Application.Current.Dispatcher.Invoke(() => { AddTab(title, content); }); }

    Problem: In diesem Fall wird das Tab nicht angezeigt. Die Methode AddTab wird zwar aufgerufen und ohne Fehler abgearbeitet, aber das Tab erscheint nicht.

    Hat jemand eine Idee, woran das liegen könnte?

    Gruß






    Dienstag, 12. März 2019 09:17

Antworten

  • Hi Abid,
    wenn Du wirklich MVVM nutzt, warum nutzt Du dann kein Binding? Obwohl Veränderungen der ObservableCollection an die Oberfläche zur Aktualisierung der Anzeige gemeldet werden, kannst Du in diesem Fall mal testen, ob ein NotifyPropertyChanged Abhilfe schafft. Ohne Kenntnis des Programmes kann es aber auch möglich sein, dass der UI-Thread beschäftigt ist und deshalb das AddTable stark verzögert ausgeführt wird.

    --
    Viele Grüsse / Best Regards
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Dienstag, 12. März 2019 10:18

Alle Antworten

  • Hi Abid,
    wenn Du wirklich MVVM nutzt, warum nutzt Du dann kein Binding? Obwohl Veränderungen der ObservableCollection an die Oberfläche zur Aktualisierung der Anzeige gemeldet werden, kannst Du in diesem Fall mal testen, ob ein NotifyPropertyChanged Abhilfe schafft. Ohne Kenntnis des Programmes kann es aber auch möglich sein, dass der UI-Thread beschäftigt ist und deshalb das AddTable stark verzögert ausgeführt wird.

    --
    Viele Grüsse / Best Regards
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Dienstag, 12. März 2019 10:18
  • Erstmal Danke für den Hinweis mit dem Binding auf ItemsSource. Habe das direkt umgesetzt.

    Ich habe den Fehler gefunden: es war eine Nachlässigkeit von mir. Ich verwende einen Mediator, um Änderungen zwischen ViewModels zu kommunizieren. Fälschlicherweise wurde über den Mediator kommuniziert, dass das Tab geschlossen werden soll. Somit wurde das Tab immer gleich geschlossen, bevor es angezeigt wurde.

    Die hatte also nichts mit dem Event-Thread zu tun, sondern es war ein Flüchtigkeitsfehler.

    Mittwoch, 13. März 2019 08:51