عنصر WPF الذي يقوم بإنشاء أطفال (مغلفين) في وقت التشغيل ديناميكيًا

StackOverflow https://stackoverflow.com/questions/3101868

سؤال

أرغب في إنشاء عنصر WPF ، في وقت التشغيل ، في السيطرة الكاملة على عناصره الفرعية - إضافة وإزالة واجهة المستخدم عند تغيير خصائصه. شيء ما يشبه إلى حد ما ما يفعله العناصر Control عندما تقوم بتعديل خاصية العناصر الخاصة به ، على الرغم من أنه في حالتي سيكون هناك طفل واحد فقط.

ستكون هذه حاوية عرض لـ MVVM - عند إعطائها نموذجًا أو عرضًا ، فإنه سيقوم بإنشاء العرض الصحيح بطريقة سحرية وتسلك كل شيء. ليست هناك حاجة إلى أن تكون حاوية العرض الخاصة بي قابلة للمعادلة (لأنها تنشئ طرق عرض محددة من قبل المستخدم ، والتي هي UserControls ولها قوالب خاصة بها) ، وأفضل أن تتغلف قدر الإمكان. من المحتمل أن أفعل ذلك بسهولة عن طريق الهبوط من شيء مثل الشبكة ، وإضافة عناصر تحكم الطفل عندما تتغير خصائقي الخاصة ؛ لكن الشبكة تكشف علنًا عن مجموعتها من عناصر الأطفال وتتيح لأي شخص إضافة الأشياء وإزالتها.

ما هي فئة WPF التي يجب أن أنزلها من أجل الحد الأقصى للتغليف ، وكيف يمكنني إضافة عناصر الأطفال إليها في وقت التشغيل؟

استنادًا إلى فهمي للمستندات ، حاولت استخدام Frameworkelement و AddvisualChild ، فقط لمعرفة ما إذا كان بإمكاني إنشاء ضوابط للأطفال في وقت التشغيل. لست واضحًا بشأن ما إذا كان AddLogicalChild ضروريًا ، لكنني وضعته في حالة:

public class ViewContainer : FrameworkElement {
    private TextBlock _child;

    public ViewContainer() {
        _child = new TextBlock { Text = "ViewContainer" };
        AddLogicalChild(_child);
        AddVisualChild(_child);
        InvalidateMeasure();
    }

    public object Content { get; set; }

    protected override Size ArrangeOverride(Size finalSize) {
        _child.Arrange(new Rect(finalSize));
        return finalSize;
    }
    protected override Size MeasureOverride(Size availableSize) {
        _child.Measure(availableSize);
        return _child.DesiredSize;
    }
}

عندما أضع ViewContainer في نافذة ، وأدير هذا ، أتوقع أن أرى نصيًا يقول "ViewContainer". لكن بدلاً من ذلك ، أرى نافذة فارغة. من الواضح أنني أفتقد شيئًا.

كيف يمكنني إصلاح الكود أعلاه بحيث تظهر عنصر تحكم "الطفل" في وقت التشغيل ، ولكن لا يتم تعريضه للآخرين للعبث (أكثر مما يمكن تجنبه)؟

هل كانت مفيدة؟

المحلول

للإجابة على سؤالك المحدد ، ستحتاج أيضًا إلى تجاوز getvisualchild و VisualChildRencount خصائص لتمكين عنصر طفلك من عرضه.

نصائح أخرى

هل فكرت في الاستفادة من دعم WPF لـ DataTemplates الضمني؟

الطريقة التي تعاملت بها مع شرط مشابه لك هي استخدام أ ContentControl. أنا ربط Content خاصية إلى ViewModel الخاص بي. أتأكد بعد ذلك من أنه في قواميس الموارد المشار إليها في مكان ما في الشجرة فوق ContentControl ، قمت بتعريف DataTemplates لجميع أنواع عارضات العرض التي قد يتم تعيينها لخاصية المحتوى.

وبهذه الطريقة ، يعتني WPF بأسلاك العرض الصحيح لـ ViewModel الخاص بي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top