2008-09-18 10 views
124

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

+1

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

उत्तर

184

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

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

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

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

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

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

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

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

+1

धन्यवाद उम्रदराज! मुझे जिस चीज की जरूरत थी। – Brad

+4

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

0

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

+0

निष्कर्ष: क्या आप संसाधन डिक का उपयोग कोड के पीछे या नहीं करने की सलाह देंगे ?? मैंने कभी इसका इस्तेमाल नहीं किया है, मैं संदेह कर रहा हूं। – Shimmy

+1

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

+0

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

8

मैं से असहमत: विंडोज 10 क्षुधा ==

के लिए और बस मामला आप UWPसाथ खेल रहे हैं में

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

एक कोड-पीछे से, आप एक एक्स का उपयोग कर सकते

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

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

+7

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

4

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

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

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

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

संबंधित मुद्दे