Frage

Ich habe zwei Bibliotheken und eine einzige Anwendung Montage, Layout und ich frage mich, wie kann ich Stile von ihren Schlüssel in einem meiner Bibliotheken verweisen, die in der anderen definiert ist.

Meine Lösung Layout:

  • WpfControls.dll - Hält generische wiederverwendbare Steuerelemente wie eine WPF-basierte NumericUpDown Steuerung sowie andere grundlegende Kontrollen und einige Arten auch, dass ich wiederverwendbar machen möchte. Aus Gründen des Beispiels lässt hier mein Stil Schlüssel sagen ist definiert als MyButtonStyle .
  • SpecializedControls.dll - Hält Kontrollen, die für unsere Anwendung wie benutzerdefinierte Verbundsteuerungen und Benutzersteuerelemente in WPF spezialisiert sind. Dies ist, wo ich möchte die MyButtonStyle Stil in WpfControls.dll definiert referenzieren Montage.
  • Application.exe -. Diese Montage Anwendungen Kontrollen in der SpecializedControls.dll definiert Baugruppe

Ich habe einige Beispiele gesehen zu erklären, wie dies zu tun, mit einer einfachen einzigen Steuer Bibliothek und Auftrageinheit aber in meinem Fall habe ich zwei Baugruppen und eine Anwendung. Also mit anderen Worten in meinem Fall habe ich nicht eine App.xaml in meiner zweiten Steuer Bibliothek, wo ich das MergeDictionaries Konzept nutzen könnte. Ich bin mir ziemlich sicher, wenn ich wollte ich ein MergedDictionaries in jeder Kontrollen XAML-Datei direkt Referenz setzen könnte alle generic.xaml in WpfControls.dll definiert zu verschmelzen Montage aber meine Vermutung ist, dass dies in verschiedenen Schnitten führen würde redundant in verschiedenen Orten zusammengeführt werden in meinem SpecializedControls Anordnung, die wie die beste Lösung scheint nicht. Erschwerend kommt hinzu, könnten diese Wörterbücher auch als auch in Application.exe zusammengeführt werden, beginnt diese meine Anwendung zur Laufzeit aufblasen?

Kann jemand erklären, was die empfohlene oder beste Ansatz für solche Arten mit der geringsten Menge an programtic und Ressourcenaufwand zu teilen.

Aktualisieren : Nach etwas mehr testen es scheint, dass ich Probleme habe jede Ressource Referenzierung innerhalb generic.xaml definiert durch seinen Schlüssel auch innerhalb der gleichen Baugruppe. Es kann über etwas völlig falsch sein, wie ich zu verstehen, wie Ressourcenschlüssel arbeiten, damit ich mehr etwas haben werden Forschung wie auch die Suche in ComponentResourceKey. Wenn jemand irgendwelche Hinweise oder Anregungen bitte Hilfe.

War es hilfreich?

Lösung

Resource-Lookup in WPF arbeitet in einer Hierarchie. Den logischen Baum, dann Anwendungsressourcen, Thema Ressourcen und schließlich Systemressourcen

Thema Ressourcen können in der Regel nur implizit zugegriffen werden (auch innerhalb der Baugruppe sie definiert sind). Dies ist nur relevant für Styles, wo die Target kann als impliziten Schlüssel verwendet werden.

Um das zu erreichen, was Sie versuchen zu tun gibt, sind zwei Möglichkeiten:

  • Verwenden Sie ein ComponentResourceKey . Dies ist ein spezieller Ressourcenschlüssel, die Referenzierung Ressourcen von anderen Baugruppen ermöglicht. Zum Beispiel können Sie einen Pinsel in definieren WpfControls Thema Wörterbuch:

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    

    Und dann können Sie verweisen sie in SpecializedControls :

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
  • Mit MergedDictionaries ein Wörterbuch in die Anwendungsressourcen importieren. Sie können dies tun, in der Anwendung Montage, und wenn die Anwendung geladen wird, auch Steuerelemente, die in sind SpecializedControls , diese Ressourcen verwenden würde. Sie werden in diesem Szenario ein Problem mit der Design-Time-Erfahrung haben, die Sie, indem Sie eine gefälschte App.xaml in lösen können SpecializedControls , das würde auch einen Verweis auf das Wörterbuch enthält.

Hope, das hilft,

Aelij.

Andere Tipps

Die akzeptierte Antwort ist richtig, ich bin nur zu erklären, wie verwenden MergedDictionaries

App.xaml ,

    <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/-DirectoryName-/FileName.xaml"/>
            <!-- Use Below syntax if your resource file is not inside a directory(in root) -->
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/FileName.xaml"/>
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top