MyControl.Margin.Left = 10;
त्रुटि:
'System.Windows.FrameworkElement.Margin' के वापसी मूल्य को संशोधित नहीं कर सकता क्योंकि यह एक चर नहीं है
जवाबों:
समस्या यह है कि Marginएक संपत्ति है, और इसका प्रकार ( Thickness) एक मूल्य प्रकार है। इसका मतलब है कि जब आप उस संपत्ति का उपयोग करते हैं जो आपको एक प्रति मिल रही है मूल्य वापस की ।
भले ही आप किसी विशेष मान के लिए संपत्ति के मूल्य को बदल सकते हैं Thickness.Left(जीआर ... परस्पर मूल्य प्रकार मौजूद नहीं होना चाहिए), यह मार्जिन को नहीं बदलेगा।
इसके बजाय, आपको Marginसंपत्ति को नए मूल्य पर सेट करना होगा । उदाहरण के लिए (संयोग से वही कोड जो मार्क ने लिखा है):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
पुस्तकालय डिजाइन के लिए एक नोट के रूप में, मैं बहुत पसंद करता था अगर यह Thicknessअपरिवर्तनीय था, लेकिन उन तरीकों के साथ जो एक नया मान लौटाते थे जो मूल की एक प्रति थी, लेकिन एक हिस्से के साथ बदल दिया गया था। तब आप लिख सकते हैं:
MyControl.Margin = MyControl.Margin.WithLeft(10);
किसी भी प्रकार के उत्परिवर्तनीय मूल्य प्रकार, अच्छे और पठनीय, सभी एक अभिव्यक्ति के बारे में कोई चिंता नहीं ...
Marginसंपत्ति एक रिटर्न Thicknessसंरचना, जिनमें से Leftएक संपत्ति है। कथन क्या करता है वह Marginसंपत्ति से संरचना मूल्य Leftकी प्रतिलिपि बना रहा है और प्रतिलिपि पर संपत्ति मूल्य निर्धारित कर रहा है। आपको एक त्रुटि मिलती है क्योंकि आपके द्वारा सेट किया गया मान वापस में संग्रहीत नहीं किया जाएगाMargin संपत्ति ।
(सी # के पहले के संस्करणों ने आपको शिकायत किए बिना ऐसा करने दिया, जिससे समाचार समूह और मंचों पर बहुत सारे सवाल पैदा हो गए कि इस तरह के बयान का कोई प्रभाव क्यों नहीं पड़ा ...)
संपत्ति सेट करने के लिए आपको संपत्ति Thicknessसे संरचना प्राप्त करने की आवश्यकता होगी Margin, मूल्य निर्धारित करें और इसे वापस स्टोर करें:
Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;
यदि आप सभी मार्जिन सेट करने जा रहे हैं, तो बस एक Thicknessसंरचना बनाएं और उन सभी को एक साथ सेट करें:
MyControl.Margin = new Thickness(10, 10, 10, 10);
Marginएक संरचना लौटा रहा है, जिसका अर्थ है कि आप एक प्रतिलिपि संपादित कर रहे हैं । आपको कुछ इस तरह की आवश्यकता होगी:
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
एक अनुमान लगाता है कि (और मेरा WPF अभी थोड़ा कठोर है) कि मार्जिन एक वस्तु लेता है और सीधे बदला नहीं जा सकता है।
जैसे
MyControl.Margin = new Margin(10,0,0,0);
उपयोग करने के लिए Thicknessआपको अपने प्रोजेक्ट .NET frameworkप्लेटफ़ॉर्म संस्करण को 4.5 पर बनाना / बदलना होगा । इस विधि को केवल 4.5 संस्करण में उपलब्ध है। (इसके अलावा आप सिर्फ PresentationFramework.dll को डाउनलोड कर सकते हैं और इस dll को रेफ़ेंस दे सकते हैं, बिना अपने .NET frameworkवर्जन को 4.5 में बदल / बदल सकते हैं ।)
लेकिन अगर आप इसे सरल करना चाहते हैं, तो आप इस कोड का उपयोग कर सकते हैं:
MyControl.Margin = new Padding(int left, int top, int right, int bottom);
भी
MyControl.Margin = new Padding(int all);
यह सरल है और आपको अपने प्रोजेक्ट में किसी भी बदलाव की आवश्यकता नहीं है
यह थोड़ा अस्पष्ट है कि आप क्या पूछ रहे हैं, लेकिन चीजों को सहज बनाने के लिए, आप अपने नियंत्रण को विरासत में ले सकते हैं और कोड के साथ एक संपत्ति जोड़ सकते हैं: मार्क का सुझाव है:
class MyImage : Image {
private Thickness thickness;
public double MarginLeft {
get { return Margin.Left; }
set { thickness = Margin; thickness.Left = value; Margin = thickness; }
}
}
फिर क्लाइंट कोड में आप बस लिख सकते हैं
MyImage img = new MyImage();
img.MarginLeft = 10;
MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft
MerginLeftपरियोजना में कई स्थानों पर फेरबदल करने की योजना बनाते हैं, तो उत्तराधिकार समस्याओं से बचा जाता है। बेशक, अगर यह आपकी परियोजना में एक जगह है, तो मैं स्वीकृत उत्तर चुनूंगा।
var- अहम, क्षमा करें; मैं ;-p "एक उपयुक्त भाषा सुविधा का उपयोग कर" मतलब