2017-09-01 4 views
1

Ich habe aC# wpf-basierte Klassenbibliothek mit Modellen, Ansichtsmodellen und Ansichten, die ich in mehreren Add-Ins für DEktop-Anwendungen mit APIs verwende unterstützt gehostete andockbare WPF-Benutzersteuerelemente. Von hier aus kann ich verschiedene Steuerelemente verwenden und Dialoge starten, um mit verschiedenen Datenstrukturen in der 3rd-Party-Anwendung zu interagieren. Meine Klassenbibliothek verfügt über keine App.xaml-Datei.Geben Sie Klassenbibliotheksartressourcenwerte aus referenzierenden Add-Ins an, oder ändern Sie sie

Ich habe eine ResourceDictionary XAML-Datei erstellt, die ich als Haupt-Stylesheet in meinen Ansichten verwende. In meinen Benutzersteuerungen und Fenstern, ich darauf verweisen:

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="../Resources/styleMain.xaml"/> 
</ResourceDictionary.MergedDictionaries 

Innerhalb dieses Stylesheet, schaff' ich meine verschiedenen Kontrollen meine Ansichten zu vereinfachen und zu vereinheitlichen. Auf der untersten Ebene habe ich Einstellungen für Dinge wie Schriftgröße, Schriftfamilie und Farbe. Zum Beispiel habe ich mehrere Pinsel, die ich in meinen Kontrollen verwende. Einer sieht so aus:

<Color x:Key="ColorBase_Primary" R="255" G="0" B="115" A="255"/> 
<SolidColorBrush x:Key="Color_Primary" Color="{StaticResource ColorBase_Primary}"/> 

Das alles funktioniert gut für Design und Tests. Ich verweise jedoch auf diese Klassenbibliothek in mehreren anderen Projekten. In diesen anderen Projekten bin Hosting, ich die Hauptbenutzersteuerung von meiner Klassenbibliothek:

<UserControl x:Class="MyAppHost.ucDockingHost" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:MyAppHost" 
      xmlns:viewModels="clr-namespace:MyClassLibrary.ViewModels;assembly=MyClassLibrary" 
      xmlns:views="clr-namespace:MyClassLibrary.Views;assembly=MyClassLibrary" 
      mc:Ignorable="d"> 

    <UserControl.DataContext> 
     <viewModels:vmMain/> 
    </UserControl.DataContext> 

    <Grid> 
     <views:ucMainGrid ViewModelMain="{Binding}" Property1="SomeValue" Property2="SomeOtherValue"/> 
    </Grid> 
</UserControl> 

Hier bin ich Einstellung DependencyProperties aus dem Add-In-Anwendung, die meine Klassenbibliothek ohne Probleme verweist, und alle meine Bindungen und Kontrollverhalten funktioniert gut.

Was ich jetzt hoffe, ist in der Lage, aus meinem Add-in (und nicht die Hauptklassenbibliothek) die grundlegenden Ressourcenwerte, die in meinem Stylesheet verwendet werden, insbesondere Farbe (wie in der Lage sein zu ändern) der mit x:Key="ColorBase_Primary" verbundene Wert). Auf diese Weise kann ich verschiedene Implementierungen an das Branding verschiedener Kunden etc. anpassen. Ich habe lange nach Beispielen oder Erkenntnissen gesucht und komme immer wieder zu kurz.

Es wäre einfach genug, einfach die gesamte Klassenbibliothek unabhängig mit jeder Anwendung zu implementieren und das Stylesheet direkt anzupassen, aber das scheint überhaupt nicht richtig zu sein. Gibt es eine Möglichkeit für mich, ein ResourceDictionary in meinen Add-In-Anwendungen zu erstellen, das die in meiner Klassenbibliothek angegebenen Ressourcenwerte liefern, ändern oder überschreiben kann? Oder sollte ich dies über eine DependencyProperty in meinem View-Modell tun? Das scheint auch nicht richtig zu sein.

+0

Ich glaube nicht, dass ich Ihre Frage verstehe. Möchten Sie einige Ressourcen überschreiben, die in der referenzierten Klassenbibliothek in einer bestimmten Anwendung definiert sind, oder was ist Ihr Problem? – mm8

+0

Sie verstehen meine Frage. Ich möchte auf meine Klassenbibliothek andere Anwendungen verweisen und in diesen Anwendungen einige Ressourcen überschreiben können. – davestasiuk

Antwort

1

Do nicht die MergedDictionaries in Ihrer Bibliothek verwenden, dh entfernen diese:

in Ihrer Anwendung Sie dann alle Ressourcen Wörterbücher aus Ihrer Bibliothek in der richtigen Reihenfolge zusammenführen:

<Application x:Class="WpfApplication1.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:WpfApplication1" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/WpfControlLibrary1;component/Brushes.xaml"/> 
      <ResourceDictionary Source="pack://application:,,,/WpfControlLibrary1;component/Controls.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
     <SolidColorBrush x:Key="brush">Red</SolidColorBrush> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

Sie können dann jede gewünschte Ressource überschreiben, indem Sie eine andere Ressource mit derselbendefinieren 210 wie ich es oben mit SolidColorBrush getan habe. Diese Ressource überschreibt jede Ressource mit einer von "Pinsel", die entweder in Brushes.xaml oder Controls.xaml definiert ist.

+0

Da ich Add-Ins für Software von Drittanbietern entwickle, die es mir erlauben, WPF-Steuerelemente zu hosten, haben weder meine Klassenbibliothek noch die sie verweisende Assembly eine XAML-Anwendungsdatei, in der ich diesem Muster folgen könnte. – davestasiuk

+1

Die Assembly wird an einer bestimmten Stelle in eine Anwendung geladen, die über eine Resources-Eigenschaft verfügt. Merge die Wörterbücher dann. Oder was genau ist deine Frage? – mm8

Verwandte Themen