2017-04-05 10 views
5

मैं ScrollableControl विस्तार करके कस्टम नियंत्रण का निर्माण कर रहा हूँ।
समस्या यह है कि मेरे कंटेनर के रूप में कस्टम नियंत्रण कार्य करता है - मैं इस पर नियंत्रण खींच सकते हैं: enter image description hereउपयोगकर्ता नियंत्रण नियंत्रण स्क्रॉल करने योग्य नियंत्रण - कंटेनर functinality अक्षम

मेरे सवाल यह है कि मैं कक्षा फैली कि ScrollableControl

नीचे दो परीक्षण नियंत्रण, एक हैं में कंटेनर कार्यक्षमता को अक्षम कर सकते हैं Control फैली हुई है, दूसरी ScrollableControl

public class ControlBasedControl : Control 
{ 
    protected override Size DefaultSize 
    { 
     get { return new Size(100, 100); } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     e.Graphics.FillRectangle(Brushes.LightCoral, ClientRectangle); 
    } 
} 

public class ScrollableControlBasedControl : ScrollableControl 
{ 
    public ScrollableControlBasedControl() 
    { 
     AutoScrollMinSize = new Size(200, 200); 
    } 

    protected override Size DefaultSize 
    { 
     get { return new Size(100, 100); } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     e.Graphics.FillRectangle(Brushes.LawnGreen, ClientRectangle); 
    } 
} 
+0

हो सकता है, आप लक्ष्य नियंत्रण में ड्रॉप घटना अशक्त कंटेनर संपत्ति या स्पष्ट बच्चों को संभालने के लिए कोशिश कर सकते हैं। –

+0

@ बरनोवस्कीडमिट्री मैं इसे डिज़ाइन समय के रूप में अक्षम करना चाहता हूं। ड्रॉप इवेंट रनटाइम पर काम करेगा। – Misiu

उत्तर

1

आपको [डिजाइनर] विशेषता से डिजाइन समय पर "कार्य-जैसी-एक-कंटेनर" व्यवहार मिलता है। Reference Source से कॉपी-पेस्ट:

[ 
ComVisible(true), 
ClassInterface(ClassInterfaceType.AutoDispatch), 
Designer("System.Windows.Forms.Design.ScrollableControlDesigner, " + AssemblyRef.SystemDesign) 
] 
public class ScrollableControl : Control, IArrangedElement { 
    // etc... 
} 

यह ScrollableControlDesigner कि काम किया जाता है। अपने आप से ज्यादा कुछ नहीं करता है, लेकिन पेरेंटकंट्रोल डिज़ाइनर से लिया गया है, जो डिज़ाइनर जो बाल नियंत्रण के लिए माता-पिता के रूप में कार्य करने के लिए नियंत्रण की अनुमति देता है और इसे डिज़ाइन समय पर कंटेनर जैसा व्यवहार देता है।

फिक्स आसान है, आपको बस एक और डिजाइनर चुनने के लिए अपने [डिजाइनर] विशेषता का उपयोग करना होगा। System.Design के लिए एक संदर्भ जोड़ें और यह इस तरह दिखने:

using System.Windows.Forms; 
using System.Drawing; 
using System.ComponentModel; 
using System.Windows.Forms.Design; // Add reference to System.Design 

[Designer(typeof(ControlDesigner))] 
public class ScrollableControlBasedControl : ScrollableControl { 
    // etc... 
} 
0

संभवतः एक से अधिक तरीका यह है, है, लेकिन यहाँ मैं क्या कर सकता है ...

012,

पहले ControlCollection

public class ReadOnlyControlCollection : Control.ControlCollection 
{ 
    public ReadOnlyControlCollection(Control owner) 
     : base(owner) 
    { 
    } 

    public override bool IsReadOnly 
    { 
     get { return true; } 
    } 

    public override void Add(Control control) 
    { 
     throw new ArgumentException("control"); 
    } 
} 

का केवल-पढ़ने के संस्करण बनाने के फिर अपने ScrollableControlBasedControl बनाने डिफ़ॉल्ट की जगह में ReadOnlyControlCollection का एक उदाहरण बनाने ControlCollection

public class ScrollableControlBasedControl : ScrollableControl 
{ 
    protected override Control.ControlCollection CreateControlsInstance() 
    { 
     return new ReadOnlyControlCollection(this); 
    } 

    // The rest of your class goes here... 
} 

मैं दृश्य स्टूडियो 2010 का उपयोग करें और जब मैं ScrollableControlBasedControl पर नियंत्रण छोड़ें नियंत्रण को जादुई रूप से वापस ले जाया गया है, जहां से यह आया था, जैसे कि कार्रवाई रद्द कर दी गई थी।

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