2008-12-24 18 views
10

यदि आप Windows फॉर्म नियंत्रण की दृश्यमान संपत्ति को सत्य पर सेट करते हैं, तो उस स्थिति की मूल विंडो छिपी हुई है, तो वह संपत्ति अभी भी झूठी होती है। क्या माता-पिता की खिड़की छिपी हुई स्थिति में नियंत्रण की असली, अंतर्निहित दृश्यता झंडा पाने का कोई तरीका है?दृश्यमान संपत्ति का "वास्तविक" मूल्य कैसे प्राप्त करें?

उत्तर

13

ठीक है, नियमित कार्यान्वयन नियंत्रण स्टैक की जांच करता है, यह सुनिश्चित करने के लिए कि सभी माता-पिता दिखाई दे रहे हैं। एक ही रास्ता मैं जानता हूँ कि चकमा करने के लिए इस प्रतिबिंब के साथ धोखा, और GetState(2) लिए पूछने के लिए है, लेकिन यह भंगुर है:

// dodgy; not recommended 
    Panel query; 
    Form form = new Form 
    { 
     Controls = { 
      new Panel { 
       Visible = false, 
       Controls = { 
        (query = new Panel {Visible = true}) 
       } 
      } 
     } 
    }; 
    form.Show(); 

    // this is the dodgy bit... 
    bool visible = (bool)typeof(Control) 
     .GetMethod("GetState", BindingFlags.Instance | BindingFlags.NonPublic) 
     .Invoke(query, new object[] { 2 }); 
+0

धन्यवाद, मैं अधिक उत्तरों की प्रतीक्षा करने के बाद वोट दूंगा। – Qwertie

+0

2 क्या है? क्या कोई निरंतर या enum आप इसके बजाय उपयोग कर सकते हैं? –

+1

@ जोन, हाँ, वहां है - लेकिन यह स्वयं आंतरिक है, इसलिए आपको इसे प्राप्त करने के लिए अधिक प्रतिबिंब का उपयोग करना होगा ;- लेकिन यह STATE_VISIBLE है। –

0

एक विकल्प है कि प्रतिबिंब पर निर्भर नहीं करता नियंत्रण के माता-पिता के माध्यम से recurse होगा पदानुक्रम दृश्यमान सेट के साथ झूठ के लिए एक की तलाश में है।

संपादित करें: कोड के महत्व के लिए टिप्पणियां देखें।

var frm2 = new Form {Text = "Form2"}; 
var lbl = new Label {Visible = true}; 
frm2.Controls.Add(lbl); 
frm2.Show(); 

var frm1 = new Form {Text = "Form1"}; 
var lblVis = new Label { Text = lbl.Visible.ToString(), Left = 10, Top = 10}; 
lbl.VisibleChanged += (sender, args) => MessageBox.Show("Label Visible changed"); 
var btnShow = new Button {Text = "Show", Left = 10, Top = lblVis.Bottom + 10}; 
btnShow.Click += (sender, args) => 
        { 
         frm2.Visible = true; 
         lblVis.Text = lbl.Visible.ToString(); 
         }; 
var btnHide = new Button {Text = "Hide", Left = 10, Top = btnShow.Bottom + 10}; 
btnHide.Click += (sender, args) => 
        { 
         frm2.Visible = false; 
         lblVis.Text = lbl.Visible.ToString(); 
        }; 

frm1.Controls.AddRange(new Control[] {lblVis, btnShow, btnHide}); 

Application.Run(frm1); 

+0

लेकिन यह आपको नहीं बताता कि मूल सत्य है या गलत है; अगर कोई अदृश्य माता-पिता नहीं हैं, तो आप (संभवतः) विश्वास कर सकते हैं। दृश्यमान, लेकिन यदि वहां * हैं, तो आपके पास कोई संकेत नहीं है कि आपका नियंत्रण (स्थानीय रूप से) दृश्यमान = सत्य या दृश्यमान = झूठा –

+0

आपको दोनों को देखना होगा, इसलिए यदि वर्तमान में किसी भी माता-पिता को झूठा लगता है तो इसका अर्थ यह होगा कि यह वर्तमान में नहीं है। – toad

+0

लेकिन यदि कोई माता-पिता अदृश्य है तो दृश्यमान कभी भी सत्य नहीं होगा; यही समस्या है: ढांचा पहले से ही यह जांचता है। मुझे लगता है कि ओपी जानना चाहता है कि नियंत्रण * स्थानीय रूप से * सोचता है कि यह दिखाई दे रहा है, यानी अगर सभी माता-पिता दिखाई दे रहे थे, तो क्या यह भी होगा? आप इसे केवल दृश्यमान नहीं ढूंढ सकते हैं। –

2

क्या मैंने किया था अस्थायी रूप से बटन को निकालने है अपनी मूल इसके दर्शनीय मूल्य की जाँच करने के लिए और फिर माता-पिता नियंत्रण करने के लिए फिर से जोड़ को नियंत्रित करता है।

यदि आपको आवश्यकता है तो आप सही सूचकांक में इसे फिर से जोड़ने के लिए बाल सूचकांक को ट्रैक कर सकते हैं।

0

मुझे 'ToolStripItem' बेस क्लास से प्राप्त कक्षाओं के साथ एक ही समस्या है। इसलिए मैंने यह देखने के लिए उपलब्ध संपत्ति मूल्य का उपयोग किया था कि आइटम प्रदर्शित किया जाएगा या नहीं। समस्या सुलझ गयी। नमूना:

ToolStripItem curItm = menuStrip1.Items[i] as ToolStripItem; 
if(curItm is ToolStripItem && curItm.Available) DoAnyThing(); 

इस नमूने में 'curItm' ToolStripItem व्युत्पन्न कक्षा का एक उदाहरण है।

माता-पिता कंटेनर के दृश्यमान/सक्षम पर निर्भर नेट नियंत्रण में दृश्यमान/सक्षम गुणों के साथ यह समस्या .Net टीम द्वारा हल की जानी चाहिए। मैं अपने स्वयं के वर्गों में IsVisible/IsEnabled नामक एक पोशाक संपत्ति बनाता हूं जो दृश्यमान/सक्षम गुणों के लिए असाइन किए गए मान को वापस करता है, न कि मूल्य जो मूल कंटेनर पर निर्भर करता है।

संबंधित मुद्दे