Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
ResourceDictionary wird mehrmals geladen?
MillionsterNutzer
myCSharp.de - Member



Dabei seit:
Beiträge: 235

Themenstarter:

ResourceDictionary wird mehrmals geladen?

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MillionsterNutzer am .
private Nachricht | Beiträge des Benutzers
Parso
myCSharp.de - Member



Dabei seit:
Beiträge: 157

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.207
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MillionsterNutzer
myCSharp.de - Member



Dabei seit:
Beiträge: 235

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
StefanS83
myCSharp.de - Member



Dabei seit:
Beiträge: 23

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.207
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Hallo StefanS83,

lass den Designer weg und arbeite mit StaticResourcen.

Gruss

Coffeebean
private Nachricht | Beiträge des Benutzers
StefanS83
myCSharp.de - Member



Dabei seit:
Beiträge: 23

beantworten | zitieren | melden

Ich steh gerade auf dem Schlauch. Wie meinst du das mit den StaticResources?
Und wie kann ich dann sehe, wie meine Styles etc. aussehen?
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.207
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
StefanS83
myCSharp.de - Member



Dabei seit:
Beiträge: 23

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
MillionsterNutzer
myCSharp.de - Member



Dabei seit:
Beiträge: 235

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MillionsterNutzer am .
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.207
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Zitat von MillionsterNutzer
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
private Nachricht | Beiträge des Benutzers