खोज…


नमस्कार संसाधन

WPF एक बहुत ही आसान अवधारणा पेश करता है: एक संसाधन के रूप में डेटा को स्टोर करने की क्षमता, या तो स्थानीय रूप से नियंत्रण के लिए, स्थानीय रूप से संपूर्ण विंडो के लिए या वैश्विक रूप से संपूर्ण एप्लिकेशन के लिए। वास्तविक जानकारी से लेकर WPF नियंत्रणों के पदानुक्रम तक, जो कुछ भी आप चाहते हैं, डेटा बहुत अधिक हो सकता है। यह आपको डेटा को एक स्थान पर रखने की अनुमति देता है और फिर इसे या कई अन्य स्थानों से उपयोग करता है, जो बहुत उपयोगी है। अवधारणा का उपयोग शैलियों और टेम्पलेट्स के लिए बहुत अधिक किया जाता है।

<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>

यहाँ छवि विवरण दर्ज करें

X: कुंजी विशेषता का उपयोग करके संसाधनों को एक कुंजी दी जाती है, जो आपको StaticResource मार्कअप एक्सटेंशन के साथ संयोजन में, इस कुंजी का उपयोग करके आवेदन के अन्य भागों से इसे संदर्भित करने की अनुमति देता है। इस उदाहरण में, मैं बस एक साधारण स्ट्रिंग संग्रहीत करता हूं, जिसे मैं तब दो अलग-अलग टेक्स्टब्लॉक नियंत्रणों से उपयोग करता हूं।

संसाधन प्रकार

एक साधारण स्ट्रिंग साझा करना आसान था, लेकिन आप बहुत कुछ कर सकते हैं। इस उदाहरण में, मैं पृष्ठभूमि के लिए उपयोग किए जाने वाले ग्रेडिएंट ब्रश के साथ स्ट्रिंग्स की एक पूरी सरणी भी संग्रहीत करूंगा। यह आपको बहुत अच्छा विचार देना चाहिए कि आप संसाधनों के साथ कितना कर सकते हैं:

<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>

यहाँ छवि विवरण दर्ज करें

इस बार, हमने कुछ अतिरिक्त संसाधन जोड़े हैं, ताकि हमारी विंडो में अब एक साधारण स्ट्रिंग, स्ट्रिंग की एक सरणी और एक LinearGradientBrush हो। स्ट्रिंग का उपयोग लेबल के लिए किया जाता है, स्ट्रिंग्स के सरणी का उपयोग कॉम्बो बॉक्स नियंत्रण के लिए आइटम के रूप में किया जाता है और ग्रेडिएंट ब्रश का उपयोग संपूर्ण विंडो के लिए पृष्ठभूमि के रूप में किया जाता है। इसलिए, जैसा कि आप देख सकते हैं, बहुत कुछ भी एक संसाधन के रूप में संग्रहीत किया जा सकता है।

स्थानीय और अनुप्रयोग विस्तृत संसाधन

यदि आपको किसी विशिष्ट नियंत्रण के लिए केवल दिए गए संसाधन की आवश्यकता है, तो आप इसे विंडो के बजाय, इस विशिष्ट नियंत्रण में जोड़कर इसे और अधिक स्थानीय बना सकते हैं। यह ठीक उसी तरह से काम करता है, एकमात्र अंतर यह है कि अब आप केवल उस नियंत्रण के दायरे के अंदर से पहुंच सकते हैं जहां आपने इसे रखा है:

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

इस स्थिति में, हम संसाधन StackPanel में जोड़ते हैं और फिर इसका उपयोग अपने बच्चे के नियंत्रण, लेबल से करते हैं। StackPanel के अंदर के अन्य नियंत्रण भी इसका इस्तेमाल कर सकते थे, ठीक उसी तरह जैसे कि इन बच्चों के नियंत्रण वाले बच्चे इसे एक्सेस करने में सक्षम होते हैं। इस विशेष स्टैकपैनल के बाहर के नियंत्रणों तक इसकी पहुँच नहीं होगी, हालाँकि।

यदि आपको कई खिड़कियों से संसाधन तक पहुंचने की क्षमता की आवश्यकता है, तो यह संभव है। App.xaml फ़ाइल में विंडो और किसी भी प्रकार के WPF नियंत्रण जैसे संसाधन हो सकते हैं, और जब आप उन्हें 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/ExtendedResourceSample.xaml">
    <Application.Resources>
        <sys:String x:Key="ComboBoxTitle">Items:</sys:String>
    </Application.Resources>
</Application>

इसका उपयोग करना भी समान है - किसी दिए गए संसाधन को खोजने के लिए, WPF स्वचालित रूप से स्थानीय नियंत्रण से खिड़की और फिर App.xaml तक के दायरे में जाएगा।

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

कोड-पीछे से संसाधन

इस उदाहरण में, हम कोड-पीछे से तीन अलग-अलग संसाधनों तक पहुँच प्राप्त करेंगे, प्रत्येक को एक अलग दायरे में संग्रहीत किया जाएगा

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>

खिड़की:

<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>

कोड के पीछे:

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());
                }
        }
}

यहाँ छवि विवरण दर्ज करें

तो, जैसा कि आप देख सकते हैं, हम तीन अलग-अलग स्टोर करते हैं "हैलो, दुनिया!" संदेश: एक App.xaml में, एक खिड़की के अंदर, और एक मुख्य पैनल के लिए स्थानीय रूप से। इंटरफ़ेस में एक बटन और एक सूची बॉक्स होता है।

कोड-पीछे में, हम बटन के क्लिक इवेंट को संभालते हैं, जिसमें हम प्रत्येक पाठ स्ट्रिंग को लिस्टबॉक्स में जोड़ते हैं, जैसा कि स्क्रीनशॉट पर देखा गया है। हम FindResource () विधि का उपयोग करते हैं, जो संसाधन को ऑब्जेक्ट (यदि मिला) के रूप में लौटाएगा, और फिर हम इसे स्ट्रिंग में बदल देते हैं जिसे हम जानते हैं कि यह ToString () विधि का उपयोग करके है।

ध्यान दें कि हम विभिन्न स्कोपों पर FindResource () पद्धति का उपयोग कैसे करते हैं - पहले पैनल पर, फिर विंडो पर और फिर वर्तमान एप्लिकेशन ऑब्जेक्ट पर। यह उस संसाधन की तलाश करने के लिए समझ में आता है जहां हम इसे जानते हैं, लेकिन जैसा कि पहले ही उल्लेख किया गया है, यदि कोई संसाधन नहीं मिला है, तो खोज पदानुक्रम तक आगे बढ़ती है, इसलिए प्रिंसिपल में, हम पैनल पर FindResource () विधि का उपयोग कर सकते थे सभी तीन मामलों, क्योंकि यह खिड़की तक और बाद में आवेदन स्तर तक जारी रहता, यदि नहीं मिला।

वही अन्य तरीके से सही नहीं है - खोज पेड़ के नीचे नहीं जाती है, इसलिए आप आवेदन स्तर पर संसाधन की तलाश शुरू नहीं कर सकते हैं, अगर इसे नियंत्रण के लिए या खिड़की के लिए स्थानीय रूप से परिभाषित किया गया है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow