दिलचस्प पोस्ट
एक डीव्ही ब्लॉक के अंदर सीएसएस केंद्र पाठ (क्षैतिज और अनुलंब) क्रोम डेवलपर टूल में जावास्क्रिप्ट को अक्षम कैसे करें jQuery: "संख्या" प्रतिबंधित करने का सबसे अच्छा तरीका क्या है पाठ बॉक्स के लिए केवल इनपुट? (दशमलव अंक की अनुमति दें) इकाई फ़्रेमवर्क 4 .NET में एक इकाई को कैसे अपडेट करें कई अल्पविराम से अलग किए गए मानों के साथ चर घोषणापत्र क्या होता है (जैसे कि var a = b, c, d;) पूर्णांक के लिए कारक कन्वर्ट अंतर्निहित पायथन फ़ंक्शंस के लिए स्रोत कोड ढूँढना? क्या यूनिटऑफवर्क और जेनेरिक रिपोजिटरी पैटर्न बेमानी ईएफ 4.1 कोड में पहले है? कोड में डेटाटामपटल बनायें बिटमैप के औसत आरजीबी रंग मानों की गणना कैसे करें पीआईपी के साथ सभी पैकेज का उन्नयन पायथन लैम्ब्डा एक लूप में सख्त अलियासिंग नियम क्या है? पिछले शब्द को काटने के बिना, एक स्ट्रिंग से पहले एक्स वर्ण कैसे प्राप्त करें? क्या करता है ? सी मतलब में?

WPF उपयोगकर्ता नियंत्रण का निपटान करना

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

public partial class MyWpfControl : UserControl { SomeDisposableObject x; // where does this code go? void Somewhere() { if (x != null) { x.Dispose(); x = null; } } } 

अब तक मैंने जो एकमात्र समाधान पाया है, वह डिस्पैचर की शटडाउन स्टार्टेड घटना की सदस्यता लेना है। क्या यह एक उचित दृष्टिकोण है?

 this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; 

वेब के समाधान से एकत्रित समाधान "WPF उपयोगकर्ता नियंत्रण का निपटान करना"

दिलचस्प ब्लॉग पोस्ट यहां है:

http://geekswithblogs.net/cskardon/archive/2008/06/23/dispose-of-a-wpf-usercontrol-ish.aspx

यह आपके संसाधनों का निपटान करने के लिए Dispatcher_ShutDownStarted की सदस्यता लेने का उल्लेख करता है।

Dispatcher.ShutdownStarted इवेंट केवल आवेदन के अंत में निकाल दिया जाता है नियंत्रण का उपयोग करने से बाहर निकलने पर बस निपटने के तर्क को कॉल करने के लिए लायक है विशेष रूप से यह संसाधनों को मुक्त करता है, जब नियंत्रण को एप्लिकेशन रनटाइम के दौरान कई बार उपयोग किया जाता है। तो ioWint समाधान बेहतर है। यहां कोड है:

 public MyWpfControl() { InitializeComponent(); Loaded += (s, e) => { // only at this point the control is ready Window.GetWindow(this) // get the parent window .Closing += (s1, e1) => Somewhere(); //disposing logic here }; } 

आपको नाशक का उपयोग करने के लिए सावधान रहना होगा। यह जीसी फ़ाइनलिएयर थ्रेड पर बुलाया जाएगा। कुछ मामलों में संसाधन जो आपके फ्रीिंग को एक अलग थ्रेड पर रिलीज़ नहीं किया जा सकता है, जिस पर उन्हें बनाया गया था।

मैं निम्नलिखित इंटरएक्टिव व्यवहार का उपयोग करने के लिए एक उतारने घटना WPF UserControls के लिए उपयोग। आप उपयोगकर्ता नियंत्रण XAML में व्यवहार को शामिल कर सकते हैं तो आप हर एक UserControl में तर्क को बिना रखे कार्यक्षमता रख सकते हैं।

एक्सएएमएल घोषणापत्र:

 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" <i:Interaction.Behaviors> <behaviors:UserControlSupportsUnloadingEventBehavior UserControlClosing="UserControlClosingHandler" /> </i:Interaction.Behaviors> 

CodeBehind हैंडलर:

 private void UserControlClosingHandler(object sender, EventArgs e) { // to unloading stuff here } 

व्यवहार कोड:

 /// <summary> /// This behavior raises an event when the containing window of a <see cref="UserControl"/> is closing. /// </summary> public class UserControlSupportsUnloadingEventBehavior : System.Windows.Interactivity.Behavior<UserControl> { protected override void OnAttached() { AssociatedObject.Loaded += UserControlLoadedHandler; } protected override void OnDetaching() { AssociatedObject.Loaded -= UserControlLoadedHandler; var window = Window.GetWindow(AssociatedObject); if (window != null) window.Closing -= WindowClosingHandler; } /// <summary> /// Registers to the containing windows Closing event when the UserControl is loaded. /// </summary> private void UserControlLoadedHandler(object sender, RoutedEventArgs e) { var window = Window.GetWindow(AssociatedObject); if (window == null) throw new Exception( "The UserControl {0} is not contained within a Window. The UserControlSupportsUnloadingEventBehavior cannot be used." .FormatWith(AssociatedObject.GetType().Name)); window.Closing += WindowClosingHandler; } /// <summary> /// The containing window is closing, raise the UserControlClosing event. /// </summary> private void WindowClosingHandler(object sender, CancelEventArgs e) { OnUserControlClosing(); } /// <summary> /// This event will be raised when the containing window of the associated <see cref="UserControl"/> is closing. /// </summary> public event EventHandler UserControlClosing; protected virtual void OnUserControlClosing() { var handler = UserControlClosing; if (handler != null) handler(this, EventArgs.Empty); } } 

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

मैंने सोचा था कि usercontrol की लोडेड घटना में, मैं अपने माता-पिता विंडो बंद करने की विधि को बंद करने के लिए अपने माता-पिता WindowClosing विधि को हुक कर सकता हूँ। इस तरह से मेरा उपयोगकर्ता कंट्रोल के बारे में पता हो सकता है जब माता-पिता की खिड़की बंद हो रही है और उसके अनुसार कार्य किया जा रहा है!

एक UserControl एक विनाशक है, आप उस का उपयोग क्यों नहीं करते?

 ~MyWpfControl() { // Dispose of any Disposable items here }