8 Stimmen

Zugriff auf ResourceDictionary von WPF UserControl

Ich versuche, ein Ressource-Wörterbuch in einem UserControl-Code-Behind über C# zugreifen und ich bin mit wenig Erfolg.

Verschmolzenes Wörterbuch:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Resources/BiometricDictionary.xaml" />                
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Eingebettetes Wörterbuch:

<UserControl.Resources>
    <BitmapImage x:Key="imageDefault">/Resources/Images/default_thumb.png</BitmapImage>
    <BitmapImage x:Key="imageDisconnected">/Resources/Images/disconnect_thumb.png</BitmapImage>
    <BitmapImage x:Key="imageFailed">/Resources/Images/failed_thumb.png</BitmapImage>
    <BitmapImage x:Key="imageSuccess">/Resources/Images/success_thumb.png</BitmapImage>
</UserControl.Resources>

Code dahinter:

        var resourceDictionary = new ResourceDictionary();
        resourceDictionary.Source = new Uri("/Resources/BiometricDictionary.xaml", UriKind.Relative);

Ich habe alle Beispiele und hilfreichen Tipps ausprobiert, aber ich komme nicht weiter. Im Moment wäre ein Erfolg, wenn ich das Wörterbuch laden könnte. Irgendwelche Vorschläge?

8voto

PeterAllenWebb Punkte 10013

Um in Ihrem Codebehind auf die XAML-Ressourcen Ihres UserControls zuzugreifen, müssen Sie lediglich auf die Eigenschaft Resources des UserControls zugreifen. Etwa so:

BitmapImage myImage = (BitmapImage)this.Resources["imageDefault"];

Die bevorzugte Methode ist jedoch die Verwendung von FindResource(), die den gesamten logischen Baum nach einer Übereinstimmung mit dem Schlüssel durchsucht, und nicht nur das Objekt, für das sie aufgerufen wird.

BitmapImage myImage = (BitmapImage)this.FindResource("imageDefault");

2voto

Max Mazur Punkte 1076

Versuchen Sie, den Schrägstrich vor Ihrem Standort zu entfernen. Das einzige Mal, dass Sie /Resources verwenden sollten, ist, wenn Sie zuerst eine Bibliothek aufrufen müssen. wie ../Resources

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
           <ResourceDictionary Source="Resources/BiometricDictionary.xaml" />                
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Ich hoffe, das hilft Ihnen.

0voto

Mark Carpenter Punkte 16847

Sie haben also ein ResourceDictionary in der Assembly eines UserControls definiert und möchten aus dem Code-Behind dieses UserControls darauf zugreifen?

Sie sollten dazu in der Lage sein. Wenn sich der von Ihnen aufgeführte Code jedoch im Konstruktor befindet, haben Sie möglicherweise keinen Zugriff auf das Ressourcenverzeichnis (es könnte noch nicht geladen sein). Versuchen Sie, denselben Code in das "loaded"-Ereignis Ihres UserControls einzufügen, und sehen Sie, ob das funktioniert. Wenn Sie einfach nur versuchen, auf eine Ressource zuzugreifen, z. B. einen Stil oder eine Vorlage, verwenden Sie die " FindResource " oder " TryFindResource "Funktionen direkt aus Ihrer Klasse sollten ebenfalls funktionieren (d.h. Sie müssen kein Objekt vom Typ "ResourceDictionary" haben).

Ich hoffe, das hilft!

0voto

D'Oh... nach der Kompilierung in das lokale Bin, so dass Verweise relativ sind, implementierte ich die Pack-URI-Lösung hier gefunden: ResourceDictionary in einer separaten Baugruppe und dann FindResource(x:Schlüsselwert hier).

@PeterAllenWeb, @Pwninstein, vielen Dank für Ihre schnellen Antworten, die mich wieder zum Nachdenken gebracht haben.

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