Ich habe in meiner WPF-Application mehrere ResourceDictionaries für verschiedene Skins. Wenn ein anderer Skin ausgewählt wird, binde ich einfach das entsprechende RessourceDictionary ein. In der GUI sind die entsprechenden Styles alle dynamisch, das funktioniert alles soweit. Aber damit das alles fehlerfrei funktioniert, müssen alle verwendeten Styles auch in allen ResourceDictionaries enthalten sein. Falls irgendwo was fehlt, bekomme ich das nicht direkt mit, ich muss die Anwendung starten und mich überall durchklicken und durch Sichtprüfung feststellen, dass alle Elemente da sind... mittelalterlich!
Daher würde ich das gerne testen. Bisher hab ich da an hundsgewöhnliche Unit-Tests gedacht, auch wenn mir schon klar ist, dass die nicht direkt für den Zweck gemacht sind. Wenn an dem Punkt schon jemand eine bessere, praktikable Lösung hat, nur her damit.
Mein Plan war also, Unit Test -> ResourceDictionary erzeugen -> FindResource("besondersTollerButtonStyle")
Leider bekomme ich es nicht hin mir innerhalb eines Unit-Tests ein ResourceDictionary zu erzeugen, wenn ich dem Dictionary eine Source zuweise, dann knallt es immer.
string filePath = GetFilepath(ESkin.DefaultSkin);
Uri uri = new Uri(filePath, UriKind.Absolute);
var rd = (ResourceDictionary) Application.LoadComponent(uri);
Fehler |
=> System.ArgumentException: "Absoluter URI kann nicht verwendet werden." |
Obwohl mir nicht klar ist, warum ich LoadComponent nicht mit einem absoluten URI aufrufen können soll, hab ich also mit relativen URIs experimentiert. Erstmal direkt aus meinem bisherigen absoluten (als korrekt angenommenen) URI:
string filePath = GetFilepath(ESkin.DefaultSkin);
Uri uri = new Uri(filePath, UriKind.Absolute);
Uri uriThis = new Uri(Path.GetDirectoryName((Assembly.GetExecutingAssembly().Location)), UriKind.Absolute);
Uri relativeUri = uriThis.MakeRelativeUri(uri);
Auch weitere verzweifelte und unbeholfene Versuche haben mich nicht weitergebracht.
Ich weiß nicht mehr weiter, kann mir sagen, wie man sowas sauber machen würde? Oder zumindest die Fehlermeldungen erklären? Oder mir sagen, an welcher Stelle ich mich verrannt habe?