मैं कस्टम UIElement-derived क्लास कैसे बना सकता हूं जिसमें अन्य UIElements बच्चों के रूप में (और प्रदर्शित) होते हैं?

आइए मान लें कि मैं एक वर्ग बनाना चाहता हूं जो सीधे UIElement से प्राप्त होता है और इसमें एक या अधिक [बाहरी रूप से जोड़ा गया] UIElement s बच्चों के रूप में शामिल है - जैसे Panel एस और अन्य कंटेनर नियंत्रण। क्लास हाउस को कुछ रूपों या अन्य में UIElement s का संग्रह करना स्पष्ट रूप से आसान है, लेकिन मैं उन्हें अपनी कक्षा के साथ प्रदर्शित/प्रस्तुत करने के लिए कैसे प्राप्त करूं?

मुझे लगता है कि उन्हें दृश्य पेड़ में अपने स्वयं के UIElement के बच्चों के रूप में कुछ तरीकों से जोड़ा जाना चाहिए (या, संभवतः, उन्हें मैन्युअल रूप से VisualTreeHelper.GetDrawing के माध्यम से जा रहा है। यह ऑनरेंडर का DrawingContext का उपयोग कर रहा है? लेकिन यह बेकार लगता है)।

मैं नहीं यह जानना चाहता हूं कि मैं FrameworkElement , Panel , जैसे अधिक तैयार किए गए नियंत्रणों से प्राप्त कर सकता हूं - या चाहिए - ContentControl आदि (यदि कुछ भी हो, तो मैं जानना चाहता हूं कि वे लागू होने वाले बाहरी तत्वों के प्रदर्शन/प्रतिपादन को कार्यान्वित कर रहे हैं)।

मेरे पास पदानुक्रम में जितना संभव हो उतना ऊंचा होना चाहते हैं, इसलिए कृपया मुझे कोई व्याख्यान न दें कि एक्सएएमएल/डब्ल्यूपीएफ फ्रेमवर्क 'अनुपालन' आदि होने की अच्छी बात क्यों है।

0
लॉल - मैं यह जोड़ने के करीब था "आप सुनते हैं, हाईकोर?" अंतिम पैराग्राफ के अंत में (इससे पहले कि मैंने देखा कि एक टिप्पणी थी .. लेकिन आपने मुझे इसे हराया)।
जोड़ा लेखक d7samurai, स्रोत
प्रतिबिंबक या कुछ के साथ PresentationFramework.dll का निरीक्षण करें।
जोड़ा लेखक Federico Berasategui, स्रोत
याद रखें अगर मैंने यह आपको कहा था, लेकिन हाँ, आप एक प्रयोग किए गए डेवलपर हैं जो वास्तव में जानता है वह क्या कर रहा है, लेकिन अधिकांश लोगों के लिए wpf का उपयोग करके बाहर, यह काफी विपरीत है। यही कारण है कि मेरे पास "आपके सभी कोड को हटाएं और एमवीवीएम सीखें" की यह चीज लगातार बार-बार आ रही है। बेशक यह आपके लिए लागू नहीं होता है, और अन्य समर्थक WPF/XAML devs
जोड़ा लेखक Federico Berasategui, स्रोत

1 उत्तर

निम्न वर्ग लेआउट और बाल तत्वों के प्रतिपादन के संदर्भ में पूर्ण न्यूनतम प्रदान करता है:

public class UIElementContainer : UIElement
{
    private readonly UIElementCollection children;

    public UIElementContainer()
    {
        children = new UIElementCollection(this, null);
    }

    public void AddChild(UIElement element)
    {
        children.Add(element);
    }

    public void RemoveChild(UIElement element)
    {
        children.Remove(element);
    }

    protected override int VisualChildrenCount
    {
        get { return children.Count; }
    }

    protected override Visual GetVisualChild(int index)
    {
        return children[index];
    }

    protected override Size MeasureCore(Size availableSize)
    {
        foreach (UIElement element in children)
        {
            element.Measure(availableSize);
        }

        return new Size();
    }

    protected override void ArrangeCore(Rect finalRect)
    {
        foreach (UIElement element in children)
        {
            element.Arrange(finalRect);
        }
    }
}

UIElementCollection होने की आवश्यकता नहीं है। एक वैकल्पिक कार्यान्वयन इस तरह दिख सकता है:

public class UIElementContainer : UIElement
{
    private readonly List children = new List();

    public void AddChild(UIElement element)
    {
        children.Add(element);
        AddVisualChild(element);
    }

    public void RemoveChild(UIElement element)
    {
        if (children.Remove(element))
        {
            RemoveVisualChild(element);
        }
    }

   //plus the four overrides
}
0
जोड़ा
तो जादू UIElementCollection में होता है?
जोड़ा लेखक d7samurai, स्रोत
बढ़िया, यह वही है जो मैं ढूंढ रहा था (और मेरी पिछली टिप्पणी के बारे में: एक सेकंड के लिए, मैंने सोचा कि शायद बच्चों की हैंडलिंग UIElementCollection में एम्बेड की गई थी, क्योंकि इसे this के साथ प्रारंभ किया गया - मैंने सोचा इसका मतलब यह हो सकता है कि यह दृश्य पेड़ आदि के साथ झुका हुआ था)। यह वास्तव में दृश्य से कितना स्टेमिंग कर रहा है?
जोड़ा लेखक d7samurai, स्रोत
.. लेकिन दृश्य से विरासत में अभ्यास बेकार है, है ना? मैंने कहीं पढ़ा है कि इसकी वास्तविक प्रतिपादन तंत्र आंतरिक हैं, इसलिए उन्हें केवल अपने वंशजों में से एक के माध्यम से अप्रत्यक्ष रूप से पहुंचा जा सकता है ..?
जोड़ा लेखक d7samurai, स्रोत
हां, ड्रॉइंगविज़ुअल के माध्यम से जा रहा था, जो मैं सोच रहा था - UIElement (FlworkElement का उल्लेख नहीं करने के लिए) के बिना नंगे बोनड कस्टम Visual s के सेट के निर्माण के लिए सबसे अच्छा पहुंच बिंदु जैसा दिखता है।
जोड़ा लेखक d7samurai, स्रोत
नहीं, आप एक सादे सूची का भी उपयोग कर सकते हैं और दृश्य पेड़ सेट अप करने के लिए जोड़ें/निकालें VisualChild पर कॉल कर सकते हैं। जादू चार ओवरराइड में है।
जोड़ा लेखक Clemens, स्रोत
जिनके पास दृश्य है, उनके नाम में: जोड़ें/निकालें VisualChild, VisualChildrenCount और GetVisualChild। UIElement MeasureCore और ArrangeCore जोड़ता है।
जोड़ा लेखक Clemens, स्रोत
खैर, मुझे एक बहुत ही व्यावहारिक उपयोग का मामला मिला है जहां मैं कंटेनर विज़ुअल और ड्रॉइंग विज़ुअल से प्राप्त हुआ हूं। आप CodePlex पर अपने XAML मानचित्र नियंत्रण में कक्षाओं TileContainer और TileLayer पर एक नज़र डाल सकते हैं।
जोड़ा लेखक Clemens, स्रोत
@ Cœur क्या आपने स्वयं कुछ भी करने की कोशिश की है? यदि ऐसा है, और आपके पास अपने दृष्टिकोण के साथ कोई विशिष्ट समस्या है, तो StackOverflow पर यहां एक प्रश्न पूछें।
जोड़ा लेखक Clemens, स्रोत
हाय, मुझे UIElement के बजाय फ्रेमवर्क एलिमेंट के लिए एक ही प्रश्न मिला (जैसा कि सिल्वरलाइट में, UIElement का कन्स्ट्रक्टर निजी है)। क्या आप मदद कर सकते हैं?
जोड़ा लेखक Cœur, स्रोत