2009-06-16 14 views

उत्तर

108

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

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

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

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

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

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

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

+3

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

+1

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

+0

संयोग से हुह? ;) – zvolkov

5

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

, उदा,

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

यह काम नहीं करता है: _ 'सिस्टम। Windows.FrameworkElement.Margin' एक 'संपत्ति' है लेकिन इसका उपयोग किया जाता है एक 'type'_ –

13

Margin एक struct, जिसका मतलब है कि आप एक प्रतिलिपि संपादन कर रहे हैं कि लौटा रहा है।

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

MyControl.Margin = मार्जिन की तरह; – TheMissingLINQ

+0

(चीयर्स, कुछ समय पहले तय किया गया था ... मुझे उम्मीद है कि आपको एक पेज रीफ्रेश की आवश्यकता है; -पी) –

+1

हे, अगर हमारे पास अजाक्स टिप्पणी अपडेट था तो मैं एक उपकरण की तरह नहीं दिख रहा था ... – TheMissingLINQ

29

Margin संपत्ति एक Thickness संरचना, जिनमें से Left एक संपत्ति है देता है: आप की तरह कुछ की आवश्यकता होगी। कथन क्या करता है Margin संपत्ति से संरचना मूल्य की प्रतिलिपि बना रहा है और प्रतिलिपि पर Left संपत्ति मान सेट कर रहा है। आपको एक त्रुटि मिलती है क्योंकि आपके द्वारा सेट किया गया मान Margin संपत्ति में वापस संग्रहीत नहीं किया जाएगा।

(सी # के पुराने संस्करण बस, शिकायत के बिना आप इसे करते हैं पर क्यों इस तरह एक बयान बिल्कुल कोई प्रभाव नहीं पड़ा समाचार समूह में सवाल और मंचों का एक बहुत पैदा कर रहा होगा ...)

संपत्ति सेट करने के लिए

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

, बस एक Thickness संरचना बना सकते हैं और उन्हें एक बार में सेट आप सभी मार्जिन सेट करने के लिए जा रहे हैं: आप Margin संपत्ति से Thickness संरचना प्राप्त करने के लिए मान सेट और इसे वापस स्टोर की आवश्यकता होगी,:

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

धन्यवाद, अच्छा। वास्तविक प्रकार को देखने के लिए – MikeMalter

4

Thickness आप बनाने की आवश्यकता का उपयोग करने के/अपनी परियोजना .NET framework मंच संस्करण को बदल 4.5 तक। becaus यह विधि केवल संस्करण 4.5 में उपलब्ध है। (इसके अलावा आप केवल प्रस्तुतिफ्रेमवर्क.dll डाउनलोड कर सकते हैं और अपने .NET framework संस्करण को 4.5 के बिना बना/बदलकर इस डीएलएल को संदर्भित कर सकते हैं।)

लेकिन अगर आप इस सरल करना चाहते हैं, आप इस कोड का उपयोग कर सकते हैं:

MyControl.Margin = new Padding(int left, int top, int right, int bottom); 

भी

MyControl.Margin = new Padding(int all); 

यह सरल है और कोई जरूरत है अपनी परियोजना में कोई परिवर्तन

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

ऐसी समस्या को हल करने के लिए विरासत का उपयोग कर? काफी बड़ा ओवरहेड, है ना? – LuckyLikey

+0

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

10

एक बस इस

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

स्थिति पर निर्भर करता है, आप भी यहाँ गद्दी संपत्ति का उपयोग कर कोशिश कर सकते हैं इस्तेमाल कर सकते हैं लिख सकते हैं ...

MyControl.Margin=new Padding(0,0,0,0); 
संबंधित मुद्दे