Laden...

ApplicationResources: Wie können DataTemplate und ResourceDictionaries simultan genutzt werden?

Letzter Beitrag vor 21 Tagen 3 Posts 152 Views
ApplicationResources: Wie können DataTemplate und ResourceDictionaries simultan genutzt werden?

Hallo,

nach langer Pause, versuche ich mich derzeit wieder an einer WPF-App. Da ich auf meiner MainView einen Content-Bereich habe, mit dem ich zu den einzelnen Views navigieren kann, benutze ich die ApplicationResources, um dort DataTemplates für meine Views zu hinterlegen. Das sieht dann so aus:

<Application x:Class="AppStart.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:views="clr-namespace:Views;assembly=Views"
             xmlns:viewModels="clr-namespace:MainViewModels;assembly=ViewModels"
             xmlns:local="clr-namespace:AppStart"
             StartupUri="pack://application:,,,/Views;component/MainView.xaml">
    <Application.Resources>
            <DataTemplate DataType="{x:Type viewModels:DefaultViewViewModel}">
                <views:DefaultView/>
            </DataTemplate>
            
            <DataTemplate DataType="{x:Type viewModels:OverviewViewModel}">
                <views:OverviewView/>
            </DataTemplate>
            
            <DataTemplate DataType="{x:Type viewModels:DetailViewModel}">
                <views:DetailView/>
            </DataTemplate>
            
            <DataTemplate DataType="{x:Type viewModels:SummaryViewViewModel}">
                <views:SummaryView/>
            </DataTemplate>
    </Application.Resources>
</Application>

Nun möchte ich allerdings Styles implementieren, auf die in der ganzen App zugegriffen werden soll (für Textboxen, Textblocks, Comboboxen, etc.). Wenn ich das so in meine App.xaml verpacke...

<Application.Resources>

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
             <!--Order is important--> 
            <ResourceDictionary Source="Styles/ColorPaletteStyles.xaml"/>
            <ResourceDictionary Source="Styles/ButtonStyles.xaml"/>
            <ResourceDictionary Source="Styles/CheckBoxStyles.xaml"/>
            <ResourceDictionary Source="Styles/ComboBoxStyles.xaml"/>
            <ResourceDictionary Source="Styles/RadioButtonStyles.xaml"/>
            <ResourceDictionary Source="Styles/TextBlockStyles.xaml"/>
            <ResourceDictionary Source="Styles/TextBoxStyles.xaml"/>
            <ResourceDictionary Source="Styles/MenuStyle.xaml"/>
            <ResourceDictionary Source="Styles/TabControlStyles.xaml"/>              
        </ResourceDictionary.MergedDictionaries>        
    </ResourceDictionary>
</Application.Resources>

...funktioniert das auch einwandfrei. Allerdings - meine DataTemplates, die ich für die View-Navigation brauche kann ich nun nicht mehr wie bisher hinzufügen. Also folgendes funktioniert nicht:

 <Application.Resources>

     <ResourceDictionary>

         <DataTemplate DataType="{x:Type viewModels:DefaultViewViewModel}">
             <views:DefaultView/>
         </DataTemplate>
         
         <ResourceDictionary.MergedDictionaries>
              <!--Order is important--> 
             <ResourceDictionary Source="Styles/ColorPaletteStyles.xaml"/>
             <ResourceDictionary Source="Styles/ButtonStyles.xaml"/>
             [...]
         </ResourceDictionary.MergedDictionaries>         
     </ResourceDictionary>
 </Application.Resources>

Auch das hier funktioniert nicht:

 <Application.Resources>
		<DataTemplate DataType="{x:Type viewModels:DefaultViewViewModel}">
             <views:DefaultView/>
         </DataTemplate>
         
     <ResourceDictionary>        
         <ResourceDictionary.MergedDictionaries>
              <!--Order is important--> 
             <ResourceDictionary Source="Styles/ColorPaletteStyles.xaml"/>
             <ResourceDictionary Source="Styles/ButtonStyles.xaml"/>
             [...]

Hier bekomme ich wenigstens einen Hinweis:

Jeder Verzeichniseintrag muss einen zugewiesenen Schlüssel aufweisen.

Auch damit komme ich nicht weiter: zwar verschwindet der Hinweis, wenn ich einen x:Key hinzufüge, allerdings müsste ich dann jedesmal wenn ich die Dienste des DataTemplates benötige das jeweilige Template explizit mit Key ansprechen, was aber beim Navigieren eher nicht geht (bzw. ich weiß nicht ob es überhaupt einen Weg gibt, das so zu bewerkstelligen...).

Die Essenz der langen Vorrede: ich bin sicher, es gibt einen einfachen Weg, damit meine DataTemplates und die ResourceDictionaries in der App.xaml friedlich koexistieren können. Genau hier brauche ich Hilfe: wie bewerkstellige ich das?

Vielen Dank,

beste Grüße

Vorph

--> ich habe bereits versucht die DataTemplates in ein REsourceDictionary auszulagern - leider funktioniert auch das scheinbar nicht.

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles/ColorPaletteStyles.xaml"/>
            <!-- ... -->
            
            <ResourceDictionary>
                <DataTemplate DataType="{x:Type viewModels:DefaultViewViewModel}">
                    <views:DefaultView/>
                </DataTemplate>
                <!-- ... -->
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Bzw. Du solltest die DataTemplates ggf. auch eigene ResourceDictionary-Dateien auslagern, um es übersichtlicher zu gestalten.

ich habe bereits versucht die DataTemplates in ein REsourceDictionary auszulagern - leider funktioniert auch das scheinbar nicht.

Den Satz hab ich leider erst übersehen.

Was heißt denn "funktioniert nicht"?
Denn genau so sollte es eigentlich gehen.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

HI Paladin,

vielen Dank für deine Hilfe - so funktioniert es nun 😃

Den Satz hab ich leider erst übersehen.

Was heißt denn "funktioniert nicht"?

Ehrlich gesagt: ich bin selbst am Rätseln! Ich hätte beinahe zurückgeschrieben, dass es tatsächlich nicht funktioniert - und zwar hatte ich mein xaml-Code entsprechend deinen Ausführungen abgeändert, trotzdem wurde die View nicht angezeigt. Keine Fehlermeldung kein gar nichts - nur die View wurde nicht angezeigt. Ich habe dann allerdings - einfach versuchsweise - meine anderen beiden Views mal eingesetzt, z. B. so:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles/ColorPaletteStyles.xaml"/>
            <!-- ... -->

            <ResourceDictionary>
                <DataTemplate DataType="{x:Type viewModels:OverviewViewViewModel}">
                    <views:OverviewVieww/>
                </DataTemplate>
                <!-- ... -->
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

--> und es hat auf Anhieb funktioniert! Ich konnte und kann mir nicht erklären, warum es mit der DefaultView einfach nicht klappen wollte. Ich weiß aber noch, dass ich gestern beim Erstellen der DefaultView eine Fehlermeldung bekommen habe, gleich nach dem Erstellen: ich kann den Inhalt leider nicht wiedergeben - ich wurde lediglich im DEsigner aufgefordert die Projektmappe neu zu erstellen. Nachdem der Inhalt der xaml im Designer einwandfrei dargestellt wurde und auch sonst alles lief, dachte ich, der Fehler hätte sich mit dem neu erstellen des Projekts erledigt. Ich kann nicht die Hand dafür ins Feuer legen, dass das tatsächlich der Grund ist, aber: ich habe den xaml-Code der DefaultView einfach kopiert, die xaml-Datei gelöscht und erneut eine DefaultView erstellt. Keine Fehlermeldung diesmal - alles klappt jetzt einwandfrei!

Deine Hilfe hat mir viele Kopfschmerzen hier erspart: ich hätte den Fehler sonstwo gesucht.

Gruß

Vorph