Laden...

ResourceDictionary wird mehrmals geladen?

Erstellt von MillionsterNutzer vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.498 Views
M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 9 Jahren
ResourceDictionary wird mehrmals geladen?

Hallo!

Meine Anwendung wird inzwischen ziemlich komplex und hat viele Windows und UserControls in verschiedenen Dateien. Damit am Ende alles einheitlich aussieht gibt es ein großes XAML-ResourceDictionary das alle Styles und teilweise auch XAML-Bilder enthält - dieses ResourceDictionary wird momentan noch in jedem Window und UserControl explizit angegeben, damit ich zur DesignZeit schon wenigstens eine grobe Vorstellung davon bekomme wie meine Arbeit nachher aussieht und ich nicht Unmengen von "The resource 'xyz' could not be resolved." Meldungen in meiner ErrorList angezeigt bekomme.
Nun musste ich feststellen das zur Laufzeit tatsächlich jedes UserControl ein und das selbe ResourceDictionary einliest, obgleich dies in den meisten Fällen gar nicht notwendig wäre da das richte ResourceDictionary bereits vom übergeordneten Element weitergegeben würde. Leider wirkt sich das inzwischen ziemlich in den Ladezeiten beim Starten der Anwendung aus so dass ich nun wirklich etwas unternehmen muss.

Kennt jemand dieses Problem und weiß einen Rat? Könnte ich evtl. die ResourceDictionaries nur zur Designzeit einbinden?

Viele Grüße

Ralf

P
157 Beiträge seit 2014
vor 9 Jahren

Jop das ist so, Mikrigweich hat diesen kleinen Umstand scheinbar immernoch nicht beheben können, vielleicht gibt es Gründe die geladenen Dictionaries nicht zu cachen...ich weiß es nicht.

Aber du kannst das selbst machen, in dem du von der Klasse Resourcedictionary erbst und die entsprechenden Mechanismen selbst implementierst, hat aber kleine Auswirkungen auf die Designer. Blend kommt damit gar nicht klar.

google doch mal nach grübel... glaube" SharedResourceDictionary", da wirst du fündig

vg

Wenn's zum weinen nicht reicht, lach drüber!

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo MillionsterNutzer,

mach dir ein ShareResourceDictionary mit dem "Source"-Propery. Dann prüfst du, ob das Dic schon die Source enthält, wenn nicht, füge es hinzu. Ein Cache im Prinzip.


 public new Uri Source
    {
      get
      {
        return _sourceUri;
      }
      set
      {
        this._sourceUri = value;
        if (!SharedResourceDictionary.SharedDictionaries.ContainsKey(value))
        {
          SharedResourceDictionary.SharedDictionaries.Add(value, (ResourceDictionary) this);
        }
        // ...
      }
    }

Haaach, zu spät 😉

Gruss
Coffeebean

M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 9 Jahren

Hallo Coffeebean! Hallo Parso!

Danke für den Hinweis! Mit dem SharedResourceDictionary sollte es klappen!

Werd mich dann mal an die Arbeit machen - Danke für die Hilfe!

VG

Ralf

S
23 Beiträge seit 2010
vor 9 Jahren

Klappt das mit dem SharedResourceDictionary bei euch im Designer? Ich habe für mich (VS2013) noch keine funktionierende Lösung gefunden. Zur Laufzeit geht es...

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo StefanS83,

lass den Designer weg und arbeite mit StaticResourcen.

Gruss

Coffeebean

S
23 Beiträge seit 2010
vor 9 Jahren

Ich steh gerade auf dem Schlauch. Wie meinst du das mit den StaticResources?
Und wie kann ich dann sehe, wie meine Styles etc. aussehen?

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo StefanS83,

wenn du StaticResources hast sollte die VS im XAML direkt auflösen können. Falls nicht, zeigt er das an. Das ist bei DynamicResources nicht der Fall. Somit setze das ein, was du brauchst. DynRes ist eher selten, meistens gehts auch mit StaticResource. Das hilft dir zu sehen, ob VS den Style findet, wenn du den Designer weglässt.

Wie das Ganze ausschaut solltest du dir eigentlich vor dem Programmieren überlegen. Ohne Designer schreibst du besseren XAML-Code und verstehst die ganze Geschichte besser.

Gruss

Coffeebean

S
23 Beiträge seit 2010
vor 9 Jahren

Okay, muss mir das wohl mit den Resources nochmal angucken. Habe denke ich zu viele DynamicResources.

Ich will den Designer auch nur für die Anzeige, zum editieren nehme ich schon das XAML.

M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 9 Jahren

Hallo StefanS83,

ich bin überrascht das du an einen Thread anknüpfst der bereits seit über einem halben Jahr erledigt war.

Ich kann dir sagen das bei meinem Projekt das SharedResourceDictionary einwandfrei funktioniert und auch ich VS2013 nutze. Im Designer verhält es sich nicht anders als das einfache ResourceDictionary. Ich nutze den VS-Designer nur um eine grobe Vorschau zu bekommen wie das Ganze zur Laufzeit aussieht und auch das stimmt meines Erachtens zu über 90%.

Der Einzige Unterschied zwischen den beiden ist ja, dass das SharedResourceDictionary eine art Singleton ist und es eben nur einmal geladen wird und anschließend von den unterschiedlichsten Windows und Controls gemeinsam genutzt wird, während das klassische ResourceDictionary mehrmals instanziert wird.

Mir ist an dieser Stelle nicht ganz klar warum eurer Meinung nach beim SharedResourceDictionary ein unterschied zum klassischen hinsichtlich der Nutzung von StaticResources und DynamicResources sein sollte. Meines Erachtens sollte das bei beiden Dictionaries gleich ablaufen.

VG

Ralf

2.207 Beiträge seit 2011
vor 9 Jahren

Mir ist an dieser Stelle nicht ganz klar warum eurer Meinung nach beim SharedResourceDictionary ein unterschied zum klassischen hinsichtlich der Nutzung von StaticResources und DynamicResources sein sollte. Meines Erachtens sollte das bei beiden Dictionaries gleich ablaufen.

Ja, das tun sie mittlerweile. Früher taten sie das nicht. Da wurden Styles von vererbten Dictionaries bei StaticResource im VS nicht richtig erkannt. Geht auch mehr darum, dass man (eben mittlerweile) sieht, dass eine StaticResource eingebunden wurde oder nicht.

Gruss

Coffeebean