क्या इवेंट हैंडलिंग के लिए WPF में संसाधन शब्दकोश के पीछे कोड सेट करना संभव है?


147

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


1
ऐसा करने का सही तरीका एक कमांड का उपयोग करना है, यह आपको बटन को सक्षम और अक्षम करने की क्षमता भी प्रदान करता है, जबकि आप इसे कर सकते हैं जिस तरह से कुछ उत्तरों ने सुझाव दिया है कि इससे मुझे एक हैक की बू आती है।
अरन मुलहोलैंड

जवाबों:


209

मुझे लगता है कि आप जो पूछ रहे हैं, क्या आप एक संसाधन के लिए एक कोड-बैक फ़ाइल चाहते हैं। आप पूरी तरह से ऐसा कर सकते हैं! वास्तव में, आप इसे उसी तरह करते हैं जैसे कि एक विंडो के लिए:

मान लीजिए कि आपके पास एक संसाधन संसाधन है, जिसे MyResourceDictionary कहा जाता है। अपनी MyResourceprise.xaml फ़ाइल में, मूल तत्व में x: वर्ग विशेषता को रखें, जैसे:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    x:Class="MyCompany.MyProject.MyResourceDictionary"
                    x:ClassModifier="public">

फिर, निम्नलिखित घोषणा के साथ MyResourceprise.xaml.cs नामक फ़ाइल के पीछे एक कोड बनाएं:

namespace MyCompany.MyProject
{
    partial class MyResourceDictionary : ResourceDictionary
    { 
       public MyResourceDictionary()
       {
          InitializeComponent();
       }     
       ... // event handlers ahead..
    }
}

और आपने कल लिया। आप जो भी चाहें कोड में पीछे रख सकते हैं: तरीके, गुण और घटना संचालकों।

== विंडोज 10 ऐप्स के लिए अपडेट ==

और अगर आप UWP के साथ खेल रहे हैं तो बस एक और बात है जो आपको पता होना चाहिए:

<Application x:Class="SampleProject.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:rd="using:MyCompany.MyProject">
<!-- no need in x:ClassModifier="public" in the header above -->

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>

                <!-- This will NOT work -->
                <!-- <ResourceDictionary Source="/MyResourceDictionary.xaml" />-->

                <!-- Create instance of your custom dictionary instead of the above source reference -->
                <rd:MyResourceDictionary />

            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>

7
Ageektrapped के उत्तर के लिए एक परिशिष्ट के रूप में: सुनिश्चित करें कि आपने अपने कोडबेहिन्द वर्ग के पूरी तरह से योग्य नाम को x: वर्ग विशेषता में रखा है। x:Class="MyCompany.MyProject.MySubFolder1.MyResourceDictionary"अन्यथा, यदि आप केवल x डालते हैं: कक्षा = "MyResourceprise", xaml parser को आपकी कक्षा नहीं मिलेगी।
अस्पष्टता

29
सुनिश्चित करें कि आप आंशिक वर्ग कोडबिंदु में एक डिफॉल्ट कंस्ट्रक्टर प्रदान करते हैं, और सुनिश्चित करें कि यह InitializeComponent () कहता है। (मेरे मामले में मैं संसाधन शब्दकोश को निर्यात करने के लिए MEF का उपयोग कर रहा था।)
स्कॉट व्हिटलॉक

4
अपडेटेड टिप्पणी के लिए अपडेटेड कोड स्निपेट। मुझे लगा कि उत्तर को पूरा करने की आवश्यकता है; एक सामान्य गलती। मैंने इसे अभी किया :) अगर आपको यह पसंद नहीं है तो वापस लाएं। जवाब के लिए धन्यवाद।
गिशु

2
ध्यान दें कि (कम से कम wp8.1 में) यह अब मान्य नहीं है और आपको एक कस्टम उपयोगकर्ता कॉन्ट्रॉल बनाना होगा, जो आपके resourcedfox संदर्भ
Jared

9
आपको रिसोर्सबॉडी की XAML फ़ाइल पर बिल्ड एक्शन को "पेज" पर सेट करना होगा, अन्यथा इनिशियलाइज़कंपोनेंट () कॉल संकलित नहीं होगा। (
रिसोर्सवार्ड

9

मैं "ageektrapped" से असहमत हूं ... एक आंशिक वर्ग की पद्धति का उपयोग करना एक अच्छा अभ्यास नहीं है। तब पृष्ठ से शब्दकोश को अलग करने का उद्देश्य क्या होगा?

कोड-पीछे से, आप कुल्हाड़ी का उपयोग कर सकते हैं: नाम तत्व का उपयोग करके:

Button myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
   ...
}

आप क्या कर सकते हैं यह अगर आप नियंत्रण जब आपके कस्टम नियंत्रण लोड करने के लिए जोड़ने का काम करना चाहते हैं OnApplyTemplate विधि में। ऐसा करने के लिए OnApplyTemplate को ओवरराइड करने की आवश्यकता है। यह एक सामान्य अभ्यास है और आपकी शैली को नियंत्रण से अलग रहने की अनुमति देता है। (शैली नियंत्रण पर निर्भर नहीं होनी चाहिए, लेकिन नियंत्रण शैली होने पर निर्भर होना चाहिए)।


7
फोबिस मुझे लगता है कि पृष्ठ से शब्दकोश को अलग करने का उद्देश्य मुख्य पृष्ठ xaml की पुन: प्रयोज्यता और पठनीयता के बारे में है। उपरोक्त समाधान ने मेरे लिए भी काम किया।
क्लीफ़ेथिस

5

गिशु - जबकि यह एक "आम तौर पर प्रोत्साहित किया जाने वाला अभ्यास नहीं हो सकता है" प्रतीत होता है यहां एक कारण है जिसे आप इसे करना चाहते हैं:

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

कोई अन्य कारण जहां आप डिफ़ॉल्ट उपयोगकर्ता इंटरैक्शन व्यवहार को बॉक्स व्यवहार से अलग करना चाहते हैं, ऐसा लगता है कि संसाधन शब्दकोश में पीछे कोड के लिए अच्छे उम्मीदवार हैं।

पूरी तरह से सहमत हैं कि जो कुछ भी अनुप्रयोग कार्यक्षमता विशिष्ट है वह संसाधन शब्दकोश के पीछे एक कोड में नहीं होना चाहिए।


0

XAML ऑब्जेक्ट ग्राफ बनाने के लिए है जिसमें कोड नहीं है।
डेटा टेम्प्लेट का उपयोग यह दर्शाने के लिए किया जाता है कि स्क्रीन पर किसी कस्टम उपयोगकर्ता-ऑब्जेक्ट को कैसे प्रस्तुत किया जाना है ... (जैसे अगर यह एक सूची बॉक्स आइटम है) व्यवहार डेटा टेम्पलेट के क्षेत्र विशेषज्ञता का हिस्सा नहीं है। समाधान निकालें ...


निष्कर्ष: क्या आप यू कोड के साथ संसाधन डीआईसी का उपयोग करने की सिफारिश करेंगे या नहीं ?? मैंने कभी इसका इस्तेमाल नहीं किया, मुझे संदेह है।
शिम्मी वेइटहैंडलर

1
मैं नहीं करता - मेरे लिए यह सही नहीं लगता। एक शब्दकोश को विशिष्ट कुंजी के लिए मान वापस करना चाहिए। ओपी के मामले में, डेटा टेम्प्लेट के साथ कोड को बंडल करना .. मैं एक अलग दृष्टिकोण की कोशिश करूँगा .. उदाहरण के लिए कमांड मॉडल का उपयोग करें। ओपी की समस्या के बारे में अधिक जानकारी की आवश्यकता है, ताकि एक अलग समाधान की सिफारिश की जा सके।
गिषु

1
पूरी तरह से असहमत हैं। MVVM के साथ, एक ऐसा परिदृश्य है जहां पीछे कोड होना अत्यंत उपयोगी है: संलग्न गुण विकसित करना। इसे पीछे के कोड के साथ काम करें, फिर इसे संलग्न संपत्ति में पोर्ट करें। यह खरोंच से संलग्न संपत्ति को विकसित करने की तुलना में बहुत तेज़ है, जब तक कि आपके पास मैनहट्टन के आकार का मस्तिष्क न हो।
कंटैंगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.