Laden...

Wie können Library und App jeweils auf das gleiche ResourceDictionary zugreifen?

Erstellt von Davaaron vor 3 Jahren Letzter Beitrag vor 3 Jahren 344 Views
D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 Jahren
Wie können Library und App jeweils auf das gleiche ResourceDictionary zugreifen?

Hi,

damit ich künftig nicht mehr immer wieder von 0 anfangen muss, verlagere ich gerade ein paar UserControls in eine Library aus. Meine Vorstellung ist es, dass die Library schon alle ResourceDictionaries beinhaltet, die in dieser Library gebraucht werden wie Icons, Styles für Buttons, Texts, etc. Die Styles sollen später zu einem DefaultTheme.xaml zusammengefasst werden mithilfe von MergedResourceDictionary.
Die Library wird in meine App eingebunden und dort sollen die Styles geladen werden in der App.xaml.

Dabei hätte ich gerne volle Design-Time Unterstützung für die Library und für die App, d.h. der Designer sollte alle Styles und Icons anzeigen. Hier soll es aber zunächst mal nur um die Icons gehen. Im Anhang seht ihr übrigens die Projektstruktur.

Die Icons.xaml ist minimalistisch und sieht so aus:


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:Davaaron.WPFManager.Resources">
    <BitmapImage x:Key="SearchIcon" UriSource="/Davaaron.WPF.Controls;component/Resources/Images/magnifier.png" />

</ResourceDictionary>

Als Beispiel ziehe ich mal meine SideMenuView heran:

<UserControl x:Class="Davaaron.WPF.Controls.Views.SideMenuView"
             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:Davaaron.WPF.Controls.Views"
             mc:Ignorable="d" 
             xmlns:vm="clr-namespace:Davaaron.WPF.Controls.ViewModels"
             d:DesignHeight="200" d:DesignWidth="150"
             d:DataContext="{d:DesignInstance vm:SideMenuViewModel, IsDesignTimeCreatable=True}">

    <!--<UserControl.Resources>
        <ResourceDictionary Source="../Resources/Dictionaries/Icons.xaml"/>
    </UserControl.Resources>-->
    
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <TextBox VerticalContentAlignment="Center">Hello, dude</TextBox>
            <Button Grid.Column="1" Command="{Binding }">
                <!--<Image Source="{StaticResource SearchIcon}"></Image>-->
                <Image Source="../Resources/Images/magnifier.png"></Image>
            </Button>

        </Grid>
        <TreeView Grid.Row="1" ItemsSource="{Binding Items}">
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type vm:SideMenuItem}" ItemsSource="{Binding Children}">
                    <TextBlock Text="{Binding DisplayName}"></TextBlock>
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>
    </Grid>
</UserControl>

Ich habe mehrere Wege ohne Erfolg probiert:

Fall 1 (auskommentierte Zeilen in SideMenuView.xaml):
Resource-Dictionary wird in dem UserControl innerhalb der Library eingebunden und im Image-Control wird die StaticResource angegeben. Der Designer zeigt das Icon nicht an, obwohl der Code fehlerfrei ist. IntelliSense zeigt mir sogar "SearchIcon" an. Starte ich die Applikation, fehlt allerdings das Icon.

Fall 2 (so wie oben gezeigt):
Das Icon wird direkt an die Source des Images gebunden (relativer Pfad). Der Designer zeigt das Icon an, aber auch beim Start der Applikation fehlt dieses. Diese Implementierung bevorzuge ich nicht, sondern war eher als "Proof of concept" gedacht.

Wenn ich in meiner App.xaml das ResourceDictionary aus WPF.Controls einbinde, bekomme ich den Fehler, dass das ResourceDictionary bereits eingebunden wurde, egal ob ich Fall 1 oder 2 verwende.

Nun meine Frage:
Wie realisiere ich es, dass ich in der Library und in der App jeweils auf die gleiche ResourceDictionary zugreifen kann? Viele Bibliotheken wie Metro bspw verwenden intern ja die selben Styles, die der Benutzer später in seiner App.xaml angibt.

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 Jahren

Ok, das war einfach...
aus irgendeinem Grund war für Icons.xaml im "Benutzerdefiniertes Tool"-Eintrag "MSBuild:Compile" eingetragen. Diesen Eintrag habe ich entfernt und habe das Bild magnifier.png auf Resource gesetzt und "immer kopieren".