Wie bekomme ich WYSIWYG-Design in Blend / VS ohne eingemischtes ResourceDictionary in jeder XAML-Datei?

8

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!

    
andyhammar 15.06.2009, 08:55
quelle

6 Antworten

8

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.

    
Brad Cunningham 17.11.2009, 00:54
quelle
10

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.

    
scobi 09.08.2011 18:13
quelle
1

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

gesetzt

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:

%Vor%

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 :)

    
aL3891 04.01.2011 12:58
quelle
0

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.

    
andyhammar 15.06.2009 18:45
quelle
0

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?

    
M. Dudley 24.07.2009 01:03
quelle
0

Sie können Ressourcen in Ressourcen von App.xaml hinzufügen, das funktioniert perfekt für mich. Oder vielleicht bekomme ich dich nicht.

    
viky 22.10.2009 09:41
quelle

Tags und Links