none
ApplicationResources (DataTemplates) in mehreren UI-Threads RRS feed

  • Frage

  • Hallo allerseits,

    entwickle eine Multi-UI-Thread WPFAnwendung, bei der ich auf folgendes - bekanntest - Problem gestoßen bin: "The calling thread cannot access this object because a different thread owns it." Also gesucht welches Objekt über mehrere Fenster verwendet wird und fündig geworden: Es war ein DataTemplate, dass über ein MergedResourceDictionary in der App.xaml eingebunden wurde.

    Dieses also entfernt (sinngemäß ItemTemplate=FindResource ersetzt durch ItemTemplate=new DataTemplate()) und die Anwendung lief wieder. Erstmal nichts weiter gedacht - war ja logisch ;) - bis ich dann gemerkt habe: "Stop - unter dem TreeView (dessen ItemTemplate die Probleme machte) ist eine ebenfalls durch DataTemplates versehene ComboBox - die soll keine Probleme machen?!"

    Also weiter gesucht & gesucht & gesucht... & gefunden! Der Dispatcher des DataTempaltes, das die ComboBox verwendet ist null?! Kann das denn sein? Noch ein bisschen rumprobiert und herausgefunden, dass ich den Thread-Fehler nur bekomme, wenn das Treeview, das als erstes das DataTemplate verwendet, keine Items hat. Das Problem tritt auf, wenn

     - TreeView a) das DataTemplate (durch erste Verwendung via FindResource?) erstellt und KEIN Item damit versieht
     - TreeView b) das DataTemplate setzen möchte (weil DataTemplate.Dispatcher != TreeView b).CurrentDispatcher)

    Funktionieren tut er aber, wenn

    - TreeView a) das DataTemplate erstellt und Items damit versieht (in diesem Moment verliert das DataTemplate sein Dispatcher?!?!)
    - TreeView b) kann das DataTemplate nun via FindResource setzen, da DataTemplate.Dispatcher null ist

     

    Kann mich darüber nur nicht so wirklich freuen... :( Kann mir dieses Verhalten bitte irgendjemand erklären? Ich hasse es Code zu verwenden, den ich nicht verstehe ;)

    Mittwoch, 16. März 2011 09:55

Antworten

  • So, und ein letztes mal:

    Habe nun zusätzlich zum ResourceDictionary in der App.xaml folgendes in den Kontruktor meines Fensters gepackt:

     if (!Application.Current.Dispatcher.CheckAccess())

    { this.Resources.MergedDictionaries.Add(

     

     

    new ResourceDictionary() { Source = new Uri("/Resources/MainResourceDictionary.xaml", UriKind.Relative) }); }

    Damit funktioniert es natürlich und ist auch eigentlich saubrer - habe ja sonst SharedResources über mehrere UI-Threads. Kann sich aber trotz allem jemand das Verhalten meiner Beispielanwendung erklären?
    • Als Antwort markiert tris. _ Donnerstag, 17. März 2011 11:09
    Donnerstag, 17. März 2011 11:09

Alle Antworten

  • Ich versuche gerade das Ganze in einer einfachen Anwendung nachzubilden, nur geligt es mir irgendwie nicht... Hat jemand irgendeine Idee, in welchem Fall ein DataTemplate überhaupt einen Dispatcher zugeordnet bekommt?

    Sehe, dass es standardmäßig garkeinen hat... Wieso bekommt mein DataTemplate einen Dispatcher?

    Mittwoch, 16. März 2011 11:34
  • So, habe das Problem jetzt rekonstruieren können! Tritt nur unter sehr spezifischen umständen auf (DataTemplate in MergedDictionary, gebunden an ItemsControl etc. pp.)

    Habe die Anwendung mal auf Megaupload hochgeladen - würde mich freuen, wenn mal jemand reinschaut. Das Problem ist wirklich sehr schnell zu sehen! Beschreibung steht in der App.xaml.

    http://www.megaupload.com/?d=8F7VK0LS

    Mittwoch, 16. März 2011 13:30
  • So, und ein letztes mal:

    Habe nun zusätzlich zum ResourceDictionary in der App.xaml folgendes in den Kontruktor meines Fensters gepackt:

     if (!Application.Current.Dispatcher.CheckAccess())

    { this.Resources.MergedDictionaries.Add(

     

     

    new ResourceDictionary() { Source = new Uri("/Resources/MainResourceDictionary.xaml", UriKind.Relative) }); }

    Damit funktioniert es natürlich und ist auch eigentlich saubrer - habe ja sonst SharedResources über mehrere UI-Threads. Kann sich aber trotz allem jemand das Verhalten meiner Beispielanwendung erklären?
    • Als Antwort markiert tris. _ Donnerstag, 17. März 2011 11:09
    Donnerstag, 17. März 2011 11:09