Suche…


Hallo Ressourcen

WPF führt ein sehr praktisches Konzept ein: Die Möglichkeit, Daten als Ressource zu speichern, entweder lokal für ein Steuerelement, lokal für das gesamte Fenster oder global für die gesamte Anwendung. Die Daten können nahezu beliebig sein, von tatsächlichen Informationen bis hin zu einer Hierarchie von WPF-Steuerelementen. Auf diese Weise können Sie Daten an einem Ort ablegen und dann von einem oder mehreren anderen Orten aus verwenden, was sehr nützlich ist. Das Konzept wird häufig für Stile und Vorlagen verwendet.

<Window x:Class="WPFApplication.ResourceSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="ResourceSample" Height="150" Width="350">
    <Window.Resources>
        <sys:String x:Key="strHelloWorld">Hello, world!</sys:String>
    </Window.Resources>
    <StackPanel Margin="10">
        <TextBlock Text="{StaticResource strHelloWorld}" FontSize="56" />
        <TextBlock>Just another "<TextBlock Text="{StaticResource strHelloWorld}" />" example, but with resources!</TextBlock>
    </StackPanel>
</Window>

Geben Sie hier die Bildbeschreibung ein

Ressourcen erhalten einen Schlüssel mit dem Attribut x: Key, mit dem Sie von anderen Teilen der Anwendung mithilfe dieses Schlüssels in Kombination mit der Markierungserweiterung StaticResource darauf verweisen können. In diesem Beispiel speichere ich nur eine einfache Zeichenfolge, die ich dann von zwei verschiedenen TextBlock-Steuerelementen verwende.

Ressourcentypen

Das Teilen einer einfachen Zeichenfolge war einfach, aber Sie können noch viel mehr tun. In diesem Beispiel speichere ich auch ein komplettes Array von Strings zusammen mit einem Farbverlaufspinsel für den Hintergrund. Dies sollte Ihnen eine ziemlich gute Vorstellung davon geben, wie viel Sie mit Ressourcen machen können:

<Window x:Class="WPFApplication.ExtendedResourceSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="ExtendedResourceSample" Height="160" Width="300"
        Background="{DynamicResource WindowBackgroundBrush}">
    <Window.Resources>
        <sys:String x:Key="ComboBoxTitle">Items:</sys:String>

        <x:Array x:Key="ComboBoxItems" Type="sys:String">
            <sys:String>Item #1</sys:String>
            <sys:String>Item #2</sys:String>
            <sys:String>Item #3</sys:String>
        </x:Array>

        <LinearGradientBrush x:Key="WindowBackgroundBrush">
            <GradientStop Offset="0" Color="Silver"/>
            <GradientStop Offset="1" Color="Gray"/>
        </LinearGradientBrush>
    </Window.Resources>
    <StackPanel Margin="10">
        <Label Content="{StaticResource ComboBoxTitle}" />
        <ComboBox ItemsSource="{StaticResource ComboBoxItems}" />
    </StackPanel>
</Window>

Geben Sie hier die Bildbeschreibung ein

Dieses Mal haben wir ein paar zusätzliche Ressourcen hinzugefügt, sodass unser Fenster jetzt eine einfache Zeichenfolge, ein Array von Zeichenfolgen und einen LinearGradientBrush enthält. Die Zeichenfolge wird für die Beschriftung verwendet, das String-Array wird als Elemente für das ComboBox-Steuerelement verwendet und der Verlaufspinsel wird als Hintergrund für das gesamte Fenster verwendet. Wie Sie sehen, kann so ziemlich alles als Ressource gespeichert werden.

Lokale und anwendungsweite Ressourcen

Wenn Sie eine bestimmte Ressource nur für ein bestimmtes Steuerelement benötigen, können Sie sie lokaler machen, indem Sie sie anstelle des Fensters zu diesem Steuerelement hinzufügen. Es funktioniert auf dieselbe Weise, der einzige Unterschied besteht darin, dass Sie jetzt nur innerhalb des Bereichs des Steuerelements darauf zugreifen können, wo Sie es ablegen:

<StackPanel Margin="10">
    <StackPanel.Resources>
        <sys:String x:Key="ComboBoxTitle">Items:</sys:String>
    </StackPanel.Resources>
    <Label Content="{StaticResource ComboBoxTitle}" />
</StackPanel>

In diesem Fall fügen wir die Ressource dem StackPanel hinzu und verwenden sie dann von ihrem untergeordneten Steuerelement Label (Label). Andere Steuerelemente im StackPanel hätten es ebenfalls verwenden können, genauso wie Kinder dieser untergeordneten Steuerelemente auf das Steuerelement zugreifen konnten. Steuerelemente außerhalb dieses StackPanel-Objekts haben jedoch keinen Zugriff darauf.

Wenn Sie die Möglichkeit benötigen, von mehreren Fenstern auf die Ressource zuzugreifen, ist dies ebenfalls möglich. Die App.xaml-Datei kann Ressourcen wie das Fenster und jede Art von WPF-Steuerelement enthalten. Wenn Sie sie in App.xaml speichern, können Sie in allen Fenstern und Benutzersteuerelementen des Projekts global darauf zugreifen. Es funktioniert genauso wie beim Speichern und Verwenden in einem Fenster:

<Application x:Class="WpfSamples.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             StartupUri="WPFApplication/ExtendedResourceSample.xaml">
    <Application.Resources>
        <sys:String x:Key="ComboBoxTitle">Items:</sys:String>
    </Application.Resources>
</Application>

Es ist auch das Gleiche - WPF wechselt automatisch vom lokalen Steuerelement zum Fenster und dann zu App.xaml, um eine bestimmte Ressource zu finden:

<Label Content="{StaticResource ComboBoxTitle}" />

Ressourcen aus Code-Behind

In diesem Beispiel greifen wir von Code-behind aus auf drei verschiedene Ressourcen zu, die jeweils in einem anderen Bereich gespeichert sind

App.xaml:

<Application x:Class="WpfSamples.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             StartupUri="WPFApplication/ResourcesFromCodeBehindSample.xaml">
    <Application.Resources>
        <sys:String x:Key="strApp">Hello, Application world!</sys:String>
    </Application.Resources>
</Application>

Fenster:

<Window x:Class="WpfSamples.WPFApplication.ResourcesFromCodeBehindSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="ResourcesFromCodeBehindSample" Height="175" Width="250">
    <Window.Resources>
        <sys:String x:Key="strWindow">Hello, Window world!</sys:String>
    </Window.Resources>
    <DockPanel Margin="10" Name="pnlMain">
        <DockPanel.Resources>
            <sys:String x:Key="strPanel">Hello, Panel world!</sys:String>
        </DockPanel.Resources>

        <WrapPanel DockPanel.Dock="Top" HorizontalAlignment="Center" Margin="10">
            <Button Name="btnClickMe" Click="btnClickMe_Click">Click me!</Button>
        </WrapPanel>

        <ListBox Name="lbResult" />
    </DockPanel>
</Window>

Code-Behind:

using System;
using System.Windows;

namespace WpfSamples.WPFApplication
{
        public partial class ResourcesFromCodeBehindSample : Window
        {
                public ResourcesFromCodeBehindSample()
                {
                        InitializeComponent();
                }

                private void btnClickMe_Click(object sender, RoutedEventArgs e)
                {
                        lbResult.Items.Add(pnlMain.FindResource("strPanel").ToString());
                        lbResult.Items.Add(this.FindResource("strWindow").ToString());
                        lbResult.Items.Add(Application.Current.FindResource("strApp").ToString());
                }
        }
}

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen, speichern wir drei verschiedene "Hallo, Welt!" messages: Eine in App.xaml, eine im Fenster und eine lokal für das Hauptfenster. Die Schnittstelle besteht aus einer Schaltfläche und einer ListBox.

In Code-Behind behandeln wir das Klickereignis der Schaltfläche, in dem wir die einzelnen Textzeichenfolgen zur ListBox hinzufügen, wie auf dem Screenshot zu sehen ist. Wir verwenden die FindResource () -Methode, die die Ressource als Objekt zurückgibt (sofern gefunden), und dann in die Zeichenfolge verwandeln, von der wir wissen, dass sie die ToString () -Methode ist.

Beachten Sie, wie wir die FindResource () - Methode in verschiedenen Bereichen verwenden - zuerst im Panel, dann im Fenster und dann im aktuellen Anwendungsobjekt. Es ist sinnvoll, nach der Ressource zu suchen, an der wir sie kennen. Wenn jedoch keine Ressource gefunden wird, wird die Suche in der Hierarchie fortgesetzt. Grundsätzlich hätten wir die FindResource () -Methode für das Panel in verwenden können alle drei Fälle, da es bis zum Fenster und später bis zur Anwendungsebene weitergegangen wäre, wenn es nicht gefunden wurde.

Das Gleiche gilt nicht umgekehrt: Die Suche navigiert nicht im Baum nach unten. Sie können also nicht auf der Anwendungsebene nach einer Ressource suchen, wenn diese lokal für das Steuerelement oder für das Fenster definiert wurde.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow