3 Stimmen

Fehler bei der Verwendung von ResourceDictionary in Silverlight

In meiner Silverlight-App habe ich UserControl und möchte eine StaticResource in einem ResourceDictionary referenzieren, das sich in einer separaten XAML-Datei befindet.

Mein UserControl sieht wie folgt aus:

<UserControl x:Class="ResourceDictionaryHeadache.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
    <UserControl.Resources>
        <ResourceDictionary Source="/SampleData.xaml" />
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot">
        <ListBox HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch"
                 ItemsSource="{StaticResource SampleData}">
        </ListBox>
    </Grid>
</UserControl>

Meine SampleData.xaml-Datei sieht folgendermaßen aus:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:Headache="clr-namespace:ResourceDictionaryHeadache">
<Headache:PersonList x:Key="SampleData">
    <Headache:Person Name="Joe" Age="20" />
    <Headache:Person Name="Sam" Age="25" />
    <Headache:Person Name="Dave" Age="30" />
</Headache:PersonList>

Ich habe die SampleData.xaml-Datei auf eine Build-Aktion von Inhalt und wenn ich die App ausführen, erhalte ich einen AG_E_PARSER_BAD_TYPE [Zeile: 5 Position: 44] Fehler in der InitializeComponent() Zeile des Konstruktors für meine UserControl.

Was ist die Ursache für diesen Fehler und wie kann ich diese Ressource korrekt referenzieren?

0 Stimmen

Manchmal Einstellung Common Language Runtime Exceptions in VS zu fangen unbehandelte Ausnahmen können Sie es zu bekommen, um Ihnen mehr Hinweise auf was tatsächlich explodiert. (Drücken Sie Strg-Alt-E, dann überprüfen Sie Thrown neben CLRE)

4voto

Stephen Price Punkte 1609

Setzen Sie die Build-Aktion auf Ressource und referenzieren Sie sie dann wie unten:

<ResourceDictionary Source="/AssemblyName;component/sampledata.xaml" />

stellen Sie sicher, dass alle in Kleinbuchstaben von der Komponente ab, wie das ist, wie es endet in den Ressourcen der DLL.

0 Stimmen

Wie soll das helfen? Es macht nicht wirklich Sinn, XAML als Ressource in der Assembly zu vergraben, es ist viel natürlicher, es als einen weiteren Eintrag in der XAP zu haben

0 Stimmen

Ich werde das heute Abend ausprobieren. Muss "component" immer wörtlich "component" heißen oder sollte es der Unterordner sein, in dem sich sampledata.xaml innerhalb des Projekts befindet? -- Außerdem stimme ich Anthony ein wenig zu, dass ich zumindest in meinem Szenario die XAML lieber als "Inhalt" statt als Ressource in der Assembly hätte. Es treibt mich in den Wahnsinn, weil ich so viele Beispiele gesehen habe, die es auf diese Weise (als Inhalt) verwenden und es scheint einfach nicht für mich hier zu funktionieren...

0 Stimmen

Das hat tatsächlich funktioniert, als ich versucht habe, Ihr Problem zu reproduzieren. Ja, "Komponente" muss buchstäblich "Komponente" heißen... Sie brauchen keinen Unterordner. Ich habe keine gute Erklärung dafür, warum das so ist, aber ich habe das Gefühl, dass es etwas damit zu tun hat, dass Ihr ResourceDictionary einen benutzerdefinierten Typ enthält und mit dem Timing, wenn das ResourceDictionary mit den beiden verschiedenen Methoden instanziiert wird. Der Pfad zur XAML-Datei ist eindeutig korrekt, der Parser ist nur auf Ihre benutzerdefinierte PersonList Typ mit der Content-Methode ersticken, aber es ist irgendwie verfügbar, wenn die Ressource-Methode verwenden.

2voto

AnthonyWJones Punkte 182582

Diese Zeile in Ihrem Ressourcen-Lexikon sieht für mich nicht richtig aus:-

 xmlns:Headache="clr-namespace:ResourceDictionaryHeadache"

Ist Ihr PersonList Klasse wirklich in einem Namespace namens ResourceDictionaryHeadache ?

Ob es ist oder nicht, ich vermute, dass der Grund, warum der Code es fehlschlägt, ist, weil XAML nicht finden können, die PersonList Typ.

bearbeiten

D'Oh! Ich habe gerade bemerkt, dass Sie das vorangestellte / aus dem Source und belassen Sie das Ressourcendictionary SampleData.xaml auf der Standard Build Action "Page".

Mit anderen Worten, wenn Sie gerade die XAML-Datei mit "Add New Item" und dann "Resource Dictionary" hinzugefügt haben, brauchen Sie nur dies in Ihrer Seite xaml:-

<UserControl.Resources> 
    <ResourceDictionary Source="SampleData.xaml" /> 
</UserControl.Resources>

0 Stimmen

Das ist der richtige Namensraum. Die Klasse PersonList ist hier abgebildet: gist.github.com/271809 . Auch wenn ich den Inhalt dieser ResourceDictionary-Datei direkt in die Ressourcen des UserControls kopiere, funktioniert es einwandfrei. Es sei denn, in einer separaten Datei bedeutet das ResourceDictionary hat Zugriff auf verschiedene Dinge, die ich nicht sehen, wie das kann das Problem sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X