Ich habe gerade ein großes Speicherproblem für mich entfernt. Ich habe unser Ressourcenwörterbuch "Themes" in jede xaml-Datei anstatt nur in app.cs.xaml eingefügt.
Nach dem Entfernen der Zusammenführung in jeder Datei außer der App.cs.xaml habe ich jedoch die Entwurfszeitstile / Vorlagen verloren.
Bitte beachten Sie: Dies gilt nur für die Styles, die in unserer Themes.xaml (z. B. Color.xaml, Brushes.xaml - wir haben einen für jeden Style-Typ) zusammengeführt haben. Sachen, die direkt in Themes.xaml definiert sind (von denen wir keine haben ..) funktionieren.
Ich sehe zwei Lösungen,
1) Lassen Sie die Zusammenführung in XAML auskommentieren und entmarkieren Sie sie einfach, wenn ich mit den Entwürfen arbeiten möchte.
2) Haben Sie dies in der Standard-Ctor von jedem Steuerelement: (Vielleicht funktioniert nur in Blend)
%Vor%Es muss einen besseren Weg geben, die Bearbeitungszeit für die Gestaltung von Seiten und Steuerelementen zu bekommen, weiß jemand?
Danke!
Ich tue eine Klasse, die von ResourceDictionary erbt und überschreibt die source -Eigenschaft, um zu überprüfen, ob IsInDesignMode wahr ist.
Wenn ich die Quelle setze, lasse ich die Quelle leer (was effektiv verhindert, dass das Wörterbuch zur Laufzeit zusammengeführt wird)
%Vor%Wenn ich jetzt das Wörterbuch in Blend referenzieren muss, füge ich in das Wörterbuch wie folgt ein
%Vor%Sie müssen immer noch im Wörterbuch in jeder Datei "zusammenführen", aber Sie zahlen nicht die Strafe, das Wörterbuch zur Laufzeit tatsächlich zu laden. Die Zusammenführung dient nur zur Unterstützung des Entwurfszeitverhaltens.
Blend 4 unterstützt "Entwurfszeitressourcen", die auch von Visual Studio 2010 unterstützt werden. Siehe Ссылка .
Es ist ziemlich einfach ein ResourceDictionary, das alle MergedDictionaries enthält, die Sie mögen, und wird in der Projektdatei wie folgt angezeigt (automatisch von Blend hinzugefügt):
%Vor%Funktioniert gut.
Janes Frage bezieht sich eigentlich auf diesen, ich habe das gleiche Problem. Ich habe eine Unterklasse von ResourceDictionary wie Foovanadil vorgeschlagen, jedoch zur Design-Zeit wirft dies eine Ausnahme "Uri Prefix nicht recodnized"
Ich erhalte diesen Fehler, selbst wenn die gesamte Unterklasse die base.Source-Eigenschaft von ResourceDictionary zuweist. Wenn ich mein benutzerdefiniertes ResourceDictionary durch das reguläre ersetze, funktioniert es ganz gut, also rät der Cider-Designer etwas Besonderes, vielleicht ResourceDictionary durch etwas anderes zu ersetzen
Ich habe das nicht in Blend versucht, aber ich bekomme es in VS2010 (SP1 Beta) Kann jemand bestätigen, dass der Posted-Awnser in vs2010 funktioniert?
-edit -
Es ist möglich, dass der WPF-basierte Designer die Ressource-Lokalisierungslogik auslöst. Ich habe woanders gelesen Diese Packungsuris basieren auf der ausführenden Assembly, nicht notwendigerweise auf der lokalen Assembly. Ich werde berichten, was ich finde
-edit2 / Lösung -
Okay, damit ich die Foovanadil-Lösung in VS2010 verwenden konnte, hier ist der Deal. Es stellte sich heraus, dass ich halb Recht hatte. Vermutlich, weil der WPF-Designer in VS2010 selbst in WPF geschrieben ist oder um eine bessere Design-Erfahrung zu bieten, verhält sich ResourceDictionary (oder eine andere Klasse, die VS2010 verwendet) anders zur Entwurfszeit.
Es stellt sich heraus, dass VS den URI ersetzt, der in der XAML eingegeben wird. Durch das Anfügen an die VS-Instanz und das Setzen eines Haltepunkts im Setter für Source
wird angezeigt, dass der tatsächliche Wert, der übergeben wird, anders ist als erwartet.
Angesichts der XAML:
%Vor% Source
ist auf
markup://1/file:///c:/PathtoMyapp/MainWindow.xaml#0/myxamlfile.xaml
statt
/myxamlfile.xaml
Deshalb erhalten wir die Ausnahme für ungültige URLs.
Wann und wo VS2010 URI
s auf diese Weise zur Entwurfszeit bearbeitet, ist mir nicht bekannt, aber das Umbenennen der Eigenschaft Source
in DesignTimeResourceDictionary
zu etwas anderem löst das Problem nicht.
Glücklicherweise gibt es einen Workaround. Wenn wir den Typ von Source
von Uri
in String
ändern, ändert der VS-Designer den Wert nicht. Im Setter erstellen wir dann einen Uri und übergeben ihn an die Basiseigenschaft:
Beachten Sie auch, dass bei Verwendung dieses Ansatzes (oder eines anderen gefundenen Objekts, z. B. Verwendung von x: class in der Ressourcendatei und direkte Instanzierung von xaml) nicht erst aktualisiert wird, wenn Sie . Wenn Sie das standardmäßige ResourceDictionary verwenden, wird der Designer aktualisiert, sobald Sie die importierten Ressourcendateien bearbeiten (noch bevor Sie speichern). Dies ist auch ein Hinweis darauf, dass der Designer ResrouceDictionary zum Entwurfszeitpunkt anders behandelt.
Hoffe jemand findet das nützlich :)
Eine andere Möglichkeit, dies zu tun (so wie wir es jetzt machen): Lassen Sie ein Pre-Build-Skript das Zusammenführen in allen XAML-Dateien kommentieren.
Erschweren das Debuggen von Speicherproblemen usw. im DEBUG-Modus, können jedoch vollständig automatisiert werden und beheben die Probleme für die endgültige Version.
Die Skript-Idee scheint mir keine gute Idee zu sein. Sie würden so viele "falsche" Revisionen in Ihrer Quellcodeverwaltung haben und ich denke, dass Sie viel Zeit damit verbringen müssten, sie zu optimieren.
Ich habe gehofft, dass VS2010 und Expression Blend 3 in diesem Bereich große Verbesserungen bringen werden. Jeder kann die Betas ausprobieren und wissen?
Tags und Links wpf design expression-blend