Laden...

Kann ich zur Laufzeit Styles bearbeiten?

Erstellt von Stefan_L_01 vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.098 Views
S
Stefan_L_01 Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren
Kann ich zur Laufzeit Styles bearbeiten?

Hallo
Ich bin totaler WPF Neuling.
Frage: Kann man irgendwie styles den User ändern lassen, z.B. unter Hinzugabe einer style Definition Datei zu der exe, wo z.B. jeder seine Buttonfarbe definieren kann wie er mag? Was dann von der exe automatisch geladen und angewendet wird? Ohne dass ich mir jetzt einen eigenen Parser schreibe und das irgendwie zur Laufzeit im Code dem Button reinstopfe?
Danke für Info
Gruß
Stefan

2.080 Beiträge seit 2012
vor 5 Jahren

Du kannst den ganzen Style zur Laufzeit neu setzen.

Was Du willst klingt nach einem eigenen Theme. Da wirst Du früher oder später nicht mehr DynamicResources vorbei kommen. Die sind wie StaticResources (solltest Du kennen), nur dass das Binding, was sie verwendet, automatisch aktualisiert wird, wenn die Ressource sich ändert.

Ein Theme landet dann in Form eines ResourceDictionaries als xaml-Datei neben der Exe. Die kannst Du dann zur Laufzeit laden. Das kannst Du dann mit einem x-beliebigen vorhandenen ResourceDictionary mergen, was alle Inhalte des Theme-Dictionaries in dieses x-beliebige Dictionary rein legt bzw. überschreibt.

Kannst ja mal hier stöbern:
https://www.c-sharpcorner.com/uploadfile/raj1979/how-to-load-skins-dynamically-in-wpf/

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

S
Stefan_L_01 Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren

Hmm eine XAML habe ich naiv schonmal neben die exe gelegt, hatte aber keinen Einfluss. Nun ich schau mir mal die samples an thx.
Letztlich will ich das was ein eine css für html ist.

edit: das sample lädt auch per command zur Laufzeit und "stopft" es dann rein, das ist halt leider genau nicht was ich haben will. Klar könnte ich auch immer Anfangs nach der Datei eines gewissen Namens suchen, laden, reinstopfen, aber geht das nicht auch automatisch irgendwie?

Gruß
Stefan

2.080 Beiträge seit 2012
vor 5 Jahren

Du programmierst, Du kannst es automatisch machen 😉

Wenn Du das allgemein und überall haben willst, dann hol die Styles in die Resources der App.xaml, die gelten global für alle Views. Das passiert einmal beim Start der Anwendung.

Oder möchtest Du, dass der Compiler das tut?
Du kannst in VisualStudio ein ResourceDictionary erstellen (eigene xaml-Datei, findet sich auch in den Elementen zum hinzufügen) und darin deine Styles erstellen. Dort, wo Du sie verwenden willst, nutzt Du dann diese Zeile:

<ResourceDictionary Source="MyFolder/MyStyles.xaml" />

Dabei wird die MyStyles.xaml-Datei immer von der aktuellen Datei ausgehend gesucht, die die Zeile enthält. Wenn die Datei also eine Ordner-Ebene über der aktuellen Datei liegt, brauchst Du "../MyFolder/MyStyles.xaml".

Allgemein kann in dem Source-String ziemlich viel drinstehen, das kann nicht nur stumpfe Datei-Pfade. Mehr findest Du unter Pack URIs in WPF.

Allerdings greift das alles auch erst zur Laufzeit. Die xaml-Dateien werden vom Compiler in binäre baml-Dateien "kompiliert" und als Ressource in der exe hinterlegt. Das siehst Du auch, wenn Du eine WPF-DLL dekompilierst. Die Styles werden also wieder erst zur Laufzeit in die Ziel-Ressourcen gelegt.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

S
Stefan_L_01 Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren

Ich glaube Ihr versteht mich alle nicht: Ich will dass jeder beliebige Anwender eine xaml editiert, zu der exe in sein Verzeichnis dazulegt, und sich bei ihm lokal der Stil dadurch ändert.

Der eine User will es also rot , der andere blau, der dritte rosa, der vierte...., der 5000te schliesslich transparent 50% schwarz/weiß mit Gradient von schräg oben nach unten...

Alles was ich bisher gefunden habe wird zur Kompillierungszeit eingebunden, ich kann es zur Ausführungszeit nicht mehr ändern - ausser dem was wie gesagt zur Kompillierungszeit als Möglichkeiten eingebunden wurde. Das ist aber nicht was ich will. Ich will nur ein Gerüst liefern, schmücken sollen es andere...

Gruß
Stefan

5.658 Beiträge seit 2006
vor 5 Jahren

Ich glaube Ihr versteht mich alle nicht

Doch, wir verstehen dich. Und es wurde dir gesagt, daß es dafür keine automatische Lösung gibt.

Alles was ich bisher gefunden habe wird zur Kompillierungszeit eingebunden

Das liegt daran, daß es keine automatische Lösung gibt.

Du kannst doch nicht erwarten, daß du einfach eine Datei in ein Verzeichnis legst, und dann das Programm automatisch erkennt, was du damit vor hast und entsprechend darauf reagiert.

Wenn du dieses Feature möchtest, dann mußt du es halt implementieren...

Weeks of programming can save you hours of planning

S
Stefan_L_01 Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren

Hallo

Ich habe es seit längerem jetzt schon geschafft ein XAML zu laden, von einem Grid das Mergeddirectory zu clearen und dann das neue ResourceDirectory hinzuzufügen.

Ich habe jetzt das Problem dass Trigger danach nicht mehr gehen, auch wenn sie einem Stil (BorderStyle) genauso im geladenen ResourceDirectory hinzugefügt sind wie in der Definition die beim laden bzw. ursprünglichen Init. Aber das scheint wohl so zu sein dass man keine Trigger auf die Art generieren kann, über geladene ResourceDirectories?

Jetzt wäre meine Idee vielleicht gewesen, den Trigger "statisch" in ein applikationsinternes ResourceDirectory auszulagern, dann beim Laden des externen resourcedirectories nur das Res.Dir rauszuschmeissen was die allg. Definitionen ohne Trigger beinhaltet, das geladene Res.Dir hinzufügen und hoffen dass der Trigger erhalten bleibt (habe schon mit manueller Triggergenerierung gearbeitet, aber der Style ist irgendwie sealed, das geht nach Generierung durch ein Res.Dir. wohl nicht mehr)
Aber: Kann man überhaupt über MergedDirectories Stile für ein und das selbe Control verteilt definieren und wenn ja, wie? Bei mir scheint die eine Definition die andere zu ersetzen und nicht zu ergänzen.

Für jeden Tipp dankbar
Stefan