c# - Displayed image in UI locks the source file -
मेरे पास एक डेटाटामप्लेट है जो यहां से बनाया गया था:
& lt; UserControl.Resources & gt; & Lt; डेटाटामप्लेट एक्स: कुंजी = "इमेजइस्टम टेम्पलेट" & gt; & Lt; स्टैकपैनेल ओरिएंटेशन = "क्षैतिज" & gt; & Lt; छवि ऊँचाई = "44" स्रोत = "{बाध्यकारी पथ}" / & gt; & Lt; लेबल सामग्री = "{बाध्यकारी नाम}" वर्टिकलएलिन्मेंट = "केंद्र" / & gt; & Lt; / StackPanel & gt; & Lt; / DataTemplate & gt; & LT; /UserControl.Resources> & Lt; कॉम्बोबॉक्स x: नाम = "छवि 1" आइटमटैम्प्लेट = "{स्टेटिक रिसोर्स इमेजमटेमप्लेट}" / & gt; कोड:
सार्वजनिक पर्यवेक्षणसंपादित करें & lt; ImageItem & gt; छवियों = नया निरीक्षणीय संकलन & lt; छविइटम & gt; (); जेनरिक.इंपोर्टग्राफ़क्स (टैबआईडी, छवि 1, चित्र); सार्वजनिक स्थैतिक शून्य आयात गृहीत (स्ट्रिंग टैबआईडी, कॉम्बो बॉक्स कॉम्बो, ऑब्सववेबल कलेक्शन & lt; ImageItem & gt; आइटम) {items.Clear (); कोशिश {string root = System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly ()। स्थान); Var फाइल = डायरेक्टरी। गेटफाइलें (पथ। कंबाइन (रूट, "इनपुट \\" + टैबआईडी), "*। पीएनजी"); फूरैश (फाइल में फाइलें) {इमेज आईटम आइटम = नया इमेजइटम (); Item.Path = file; Item.Name = पथ। GetFileName (फ़ाइल)। हटायें (पथ। GetFileName (फ़ाइल)। लैंप - 4); items.Add (आइटम); }} पकड़ (अपवाद) {} combo.ItemsSource = items; } सार्वजनिक वर्ग ImageItem {सार्वजनिक स्ट्रिंग पथ {get; सेट; } सार्वजनिक स्ट्रिंग नाम {get; सेट; }} समस्या ये है कि इन छवियों को datatemplate में बाध्य किया गया है, छवि स्रोत "ताले" जिसका मतलब है कि मैं छवियों को संपादित नहीं कर सकता जब तक कार्यक्रम चल रहा है ... मुझे यह बताए हुए एक त्रुटि मिलेगी कि छवि उपयोग में है। क्या यह तय करने का कोई तरीका है?
यहां एक छवि का कंकाल है जब भी आप इसे बाहर से संशोधित करते हैं, तब अपडेट किया जाएगा। - आप स्रोत सेट करते हैं, यह इसे एक अस्थायी पथ पर प्रतिलिपि बनाता है और वहां से छवि को लोड करता है
- यह परिवर्तनों की देखरेख करता है
आप केवल
आप स्वत: अद्यतन सुविधा का उपयोग कर सकते हैं, अगर आप केवल
कोड:
सिस्टम का उपयोग कर; System.IO का उपयोग कर; System.Windows का उपयोग कर; System.Windows.Controls का उपयोग कर; System.Windows.Media। इमेजिंग का उपयोग कर; नामस्थान WpfApplication4 {/// & lt; सारांश & gt; /// MainWindow.xaml के लिए इंटरैक्शन लॉजिक /// & lt; / सारांश & gt; सार्वजनिक आंशिक कक्षा मुख्य विंडो: विंडो {सार्वजनिक मुख्य विंडो () {आरंभिकसमूह (); लोड किया गया + = मुख्यविनॉ_लोडेड; } निजी शून्य MainWindow_Loaded (ऑब्जेक्ट प्रेषक, RoutedEventArgs ई) {DynamicImage1.SetSource (@ "d: \ Untitled.png"); }} आंतरिक श्रेणी DynamicImage: छवि {निजी स्ट्रिंग _name; निजी फाइलसिस्टम वॉटर _watcher; सार्वजनिक शून्य SetSource (स्ट्रिंग फाइलनाम) {यदि (fileName == रिक्त) नया ArgumentNullException ("fileName") फेंकना; अगर (_watcher! = Null) {_watcher.Changed - = watcher_Changed; _watcher.Dispose (); } स्ट्रिंग पथ = पथ.गेट डायरेक्टरीनाम (फ़ाइलनाम); _watcher = नया FileSystemWatcher (पथ); _watcher.EnableRaisingEvents = सच; _watcher.Changed + = watcher_Changed; _name = fileName; स्ट्रिंग tempFileName = पथ। GetTempFileName (); फ़ाइल। कॉपी (फ़ाइलनाम, tempFileName, सच); स्रोत = नया बिटमैप छवि (नया उरी (tempFileName)); } प्राइवेट व्हॉयड वॉचर (ऑब्जेक्ट प्रेषक, फाइलसिस्टम एवेंट एर्ग्स ई) {बूल बी = स्ट्रिंग। एक्लल्स (ई। फुलपाथ, _name, स्ट्रिंग कॉमपरिसन। इन्विरिएन्ट कल्चर इग्नेर सीज़); अगर (बी) {string tempFileName = पथ। GetTempFileName (); फ़ाइल। कॉपी (ई। फुलपाथ, टेम्पैफ़ाइलनाम, सच); Dispatcher.BeginInvoke ((क्रिया) (() = & gt; {स्रोत = नया बिटमैप छवि (नया उरी (tempFileName))}})); _name = e.FullPath; }}}} XAML:
& lt; विंडो x: कक्षा = "WpfApplication4.MainWindow" xmlns = "http://schemas.microsoft Com / winfx / 2006 / xaml / प्रस्तुति "xmlns: x =" http://schemas.microsoft.com/winfx/2006/xaml "xmlns: wpfApplication4 =" clr- नामस्थान: WpfApplication4 "शीर्षक =" मुख्य विंडो "ऊँचाई =" 350 "चौड़ाई =" 525 "& gt; & LT; ग्रिड & gt; & Lt; wpfApplication4: DynamicImage x: नाम = "DynamicImage1" / & gt; & Lt; / ग्रिड & gt; & Lt; / विंडो & gt;
Comments
Post a Comment