myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » Kann man für Dark/Light Mode ControlTemplate und Style in verschiedene ResourceDictionaries legen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Kann man für Dark/Light Mode ControlTemplate und Style in verschiedene ResourceDictionaries legen?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
ByteDevil ByteDevil ist männlich
myCSharp.de-Mitglied

avatar-4066.png


Dabei seit: 02.03.2013
Beiträge: 121
Entwicklungsumgebung: VS 2019 Pro


ByteDevil ist offline

Kann man für Dark/Light Mode ControlTemplate und Style in verschiedene ResourceDictionaries legen?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

folgendes Szenario: In einer größeren Solution die aus vielen Projekten besteht (C++ code und UI, Windows Forms UI und nun auch WPF) soll es nun möglich sein, bei den neuen Programmteilen welche in WPF umgesetzt sind, zur Laufzeit zwischen einem Dark- und einem Light-Mode umzuschalten. Nun überlege ich gerade wie man das Ganze strukturieren kann, damit es später möglichst einfach wird die controls zu stylen und zu nutzen...hier kommen Standard WPF-Controls zum einsatz, sowie UserControls und CustomControls.

Meine Idee war:

Ich definiere von jedem Control zwei Styles (Light und Dark) und (wenn nötig) ein ControlTemplate, da das Template ja immer gleich sein soll. Sowohl das Template als auch jeder Style soll in ein eigenes ResourceDictionary... Das mit den Templates wird von jedem der Theme-ResourceDictionaries eingebunden und eines der beiden Themes wird dann von dem Window eingebunden. So wirken sich Änderungen an einem Template auf beide Themes aus.

Versuche in nun folgendes:

XML-Code:
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestProject"
>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="ControlTemplates.xaml"/>
    </ResourceDictionary.MergedDictionaries>

    <Style TargetType="{x:Type local:MyButton}">
        <Setter Property="Background" Value="#494949"/>
        <Setter Property="Foreground" Value="#DEDEDE"/>
        <Setter Property="Template" Value="{DynamicResource MyButtonTemplate}"/>
    </Style>
</ResourceDictionary>

(ControlTemplates.xaml enthält erstmal nur ein ControlTemplate mit dem Key "MyButtonTemplate" mit dem TargetType "MyButton". MyButton ist ein CustomControl welches von Button erbt. Musste einige zusätzliche Properties einbauen)

und binde dieses ResourceDictionary nun in meine Window.Resources ein, bekomme ich folgende Exception direkt beim Start:

Fehlermeldung:
System.Windows.Markup.XamlParseException: "Zeilennummer "17" und Zeilenposition "48" von "Beim Festlegen der Eigenschaft "System.Windows.Setter.Value" wurde eine Ausnahme ausgelöst."."

Innere Ausnahme:
ArgumentException: Bei dem Ausdruckstyp handelt es sich nicht um einen gültigen Style-Wert.

Das Problem scheint beim Setter des Templates zu liegen. Kommentiere ich das aus, kracht es nicht mehr...natürlich ist dann von dem Control nichts zu sehen, weil kein Template da ist.

Compiliert prima und IntelliSense bzw. Resharper meckert auch nirgends.
Packe ich das Template direkt in den Setter und definiere es somit in dem Style, klappt alles ganz prima. Auch das umschalten zur Laufzeit. Dann habe ich das Template aber in jedem Theme einmal drin stehen und das obwohl es immer identisch ist. Das heißt ich muss immer beide anpassen wenn ich was ändere und es bläht die beiden Themes sehr auf. Das wollte ich so nur machen, falls es tatsächlich mal den Fall gibt, dass das Template sich in beiden Themes unterscheiden soll.

Ist das was ich da vor habe überhaupt möglich? Wenn ja was mache ich falsch?

Habe diesen oder einen ähnlichen Ansatz noch nirgends im Netz entdeckt.

Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von ByteDevil am 01.07.2020 11:12.

Neuer Beitrag 01.07.2020 10:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 893


witte ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Verwende doch einfach Mahapps.Metro
Neuer Beitrag 01.07.2020 11:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ByteDevil ByteDevil ist männlich
myCSharp.de-Mitglied

avatar-4066.png


Dabei seit: 02.03.2013
Beiträge: 121
Entwicklungsumgebung: VS 2019 Pro

Themenstarter Thema begonnen von ByteDevil

ByteDevil ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@witte Hi und danke für die Antwort :) Mhhh 3rd Party-Libs würde ich da gern wenn möglich vermeiden. Das muss doch mit WPF-Boardmitteln möglich sein, oder? Aber ich behalte den Tipp im Hinterkopf.
Neuer Beitrag 01.07.2020 11:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ByteDevil ByteDevil ist männlich
myCSharp.de-Mitglied

avatar-4066.png


Dabei seit: 02.03.2013
Beiträge: 121
Entwicklungsumgebung: VS 2019 Pro

Themenstarter Thema begonnen von ByteDevil

ByteDevil ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Update: Entschuldigt bitte...es funktioniert ganz genauso wie ich es beschrieben habe. Es war ein Fehler im Template selbst, der sich da reingeschummelt hat. Also kann man so machen wie ich, falls das jemandem weiterhilft. Danke :)
Neuer Beitrag 01.07.2020 12:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 08.08.2020 02:54