कोड में मार्जिन गुण सेट करना


82
MyControl.Margin.Left = 10;

त्रुटि:

'System.Windows.FrameworkElement.Margin' के वापसी मूल्य को संशोधित नहीं कर सकता क्योंकि यह एक चर नहीं है

जवाबों:


138

समस्या यह है कि Marginएक संपत्ति है, और इसका प्रकार ( Thickness) एक मूल्य प्रकार है। इसका मतलब है कि जब आप उस संपत्ति का उपयोग करते हैं जो आपको एक प्रति मिल रही है मूल्य वापस की ।

भले ही आप किसी विशेष मान के लिए संपत्ति के मूल्य को बदल सकते हैं Thickness.Left(जीआर ... परस्पर मूल्य प्रकार मौजूद नहीं होना चाहिए), यह मार्जिन को नहीं बदलेगा।

इसके बजाय, आपको Marginसंपत्ति को नए मूल्य पर सेट करना होगा । उदाहरण के लिए (संयोग से वही कोड जो मार्क ने लिखा है):

Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;

पुस्तकालय डिजाइन के लिए एक नोट के रूप में, मैं बहुत पसंद करता था अगर यह Thicknessअपरिवर्तनीय था, लेकिन उन तरीकों के साथ जो एक नया मान लौटाते थे जो मूल की एक प्रति थी, लेकिन एक हिस्से के साथ बदल दिया गया था। तब आप लिख सकते हैं:

MyControl.Margin = MyControl.Margin.WithLeft(10);

किसी भी प्रकार के उत्परिवर्तनीय मूल्य प्रकार, अच्छे और पठनीय, सभी एक अभिव्यक्ति के बारे में कोई चिंता नहीं ...


3
वास्तविक प्रकार देखने के लिए यश ... मैं कबूल करने के लिए कबूल करता हूं var- अहम, क्षमा करें; मैं ;-p "एक उपयुक्त भाषा सुविधा का उपयोग कर" मतलब
मार्क Gravell

1
इसने मदद की कि त्रुटि संदेश में पूरी तरह से योग्य प्रकार का नाम था। MSDN के लिए एक त्वरित बुकमार्क के साथ, मुझे सही पृष्ठ पर पहुंचने के लिए पता बार पर "msdn System.Windows.FrameworkElement.Margin" की आवश्यकता है ...
जॉन स्कीट

मार्क, zvolkov हमारे रहस्य की खोज की है! यह पता चला कि एक दिन में 200 प्राप्त करना बहुत आसान था, इसलिए मैंने सोचा कि मैं खुद को एक चुनौती के रूप में स्थापित करूंगा और शीर्ष 2 उपयोगकर्ताओं को प्राप्त करने का प्रयास करूंगा। मॉडरेटर के रूप में "मार्क" प्राप्त करना सिर्फ एक बोनस था ...;)
जॉन स्कीट

लेकिन हममें से बाकी लोगों का क्या? मेरा मतलब है की मै? क्या उन्हें अभी तक "लीजन" स्क्रिप्ट के बारे में पता है?
मार्क ग्रेवेल

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

41

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);

13

Marginएक संरचना लौटा रहा है, जिसका अर्थ है कि आप एक प्रतिलिपि संपादित कर रहे हैं । आपको कुछ इस तरह की आवश्यकता होगी:

var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;

(चीयर्स, कुछ समय पहले तय ... मुझे उम्मीद है कि आपको एक पृष्ठ ताज़ा करने की आवश्यकता होगी?
मार्क ग्रेवल

11

एक बस इस का उपयोग कर सकता है

MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);

4

एक अनुमान लगाता है कि (और मेरा WPF अभी थोड़ा कठोर है) कि मार्जिन एक वस्तु लेता है और सीधे बदला नहीं जा सकता है।

जैसे

MyControl.Margin = new Margin(10,0,0,0);

यह काम नहीं करता है: 'System.Windows.FrameworkElement.Margin' एक 'संपत्ति' है, लेकिन इसका उपयोग 'टाइप' की तरह किया जाता है
Tor Klingberg

4

उपयोग करने के लिए 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);

यह सरल है और आपको अपने प्रोजेक्ट में किसी भी बदलाव की आवश्यकता नहीं है


3

स्थिति पर निर्भर करता है, आप यहाँ पैडिंग प्रॉपर्टी का उपयोग करके भी देख सकते हैं ...

MyControl.Margin=new Padding(0,0,0,0);

2

मार्जिन = नई मोटाई (0, 0, 0, 0);


आपके कोड के बारे में अधिक स्पष्टीकरण अच्छा होगा। कृपया केवल पोस्टिंग कोड से परहेज करें।
जैकीफ

0

यह थोड़ा अस्पष्ट है कि आप क्या पूछ रहे हैं, लेकिन चीजों को सहज बनाने के लिए, आप अपने नियंत्रण को विरासत में ले सकते हैं और कोड के साथ एक संपत्ति जोड़ सकते हैं: मार्क का सुझाव है:

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

इस तरह की समस्या को हल करने के लिए विरासत का उपयोग करना? एक बड़ा उपरि, यह नहीं है?
लकीलीकी

@LuckyLikey यह उपयोग के मामले पर निर्भर करता है: यदि आप MerginLeftपरियोजना में कई स्थानों पर फेरबदल करने की योजना बनाते हैं, तो उत्तराधिकार समस्याओं से बचा जाता है। बेशक, अगर यह आपकी परियोजना में एक जगह है, तो मैं स्वीकृत उत्तर चुनूंगा।
जन तुरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.