WPF: استبدل XAML من الصفحة أو USERCONTROL (كلاهما على ما يرام) في وقت التشغيل؟
-
29-09-2019 - |
سؤال
أعلم أنه من الممكن تحليل XAML - ملف في وقت التشغيل وإنشاء uiElement يمكنني إدراجه في شبكة صفحاتي ، لا مشكلة هناك.
لكن ما أريده حقًا هو استبدال XAML بأكمله في صفحتي أو USERCONTROL ، هل هذا ممكن أيضًا؟
منطق:
أرغب في منح مستخدمي طلبي الفرصة لتشغيل التطبيق (يستغرق بدء التشغيل الأعمار - ولا يمكن اختصار ذلك بسبب بعض المشكلات القديمة) وببساطة تحديث العرض بواسطة "Ctrl + S" في المزيج.
المحلول
يعتمد ذلك على ما إذا كنت ترفق معالجات الأحداث أو استخدام سمة "الاسم" أو "X: Name" للوصول إلى عناصر واجهة المستخدم من التعليمات البرمجية.
تطبيق MVVM نقي لطيف
أولاً ، لنفترض أن لديك تطبيق MVVM النقي اللطيف يستخدم الربط والأوامر على وجه الحصر ، لذلك لا تستخدم عناصر واجهة المستخدم المسماة أو معالجات الأحداث الكود. جيد لك: لديك بنية تطبيق نظيفة لطيفة وأنا معجب بك.
في هذه الحالة ، كل ما عليك القيام به هو إنشاء نسخة مؤقتة من ملف XAML الخاص بك مع إزالة سمة Class X: Class ، واتصل:
Application.LoadComponent(this, uriToTemporaryCopy);
تطبيق قبيح غير MVVM
الآن ، لنفترض أنك استخدمت عنصرًا يسمى بـ X: Name أو Name من الكود-Behind (Naughty ، Naughty ، Naughty!) ، أو قمت بتوصيل معالج حدث باستخدام Xaml (أقل شقيًا ولكن ليس نقيًا أيضًا). ليس لديك بنية نظيفة لطيفة ، لكني ما زلت أحبك على أي حال.
في هذه الحالة ، لن يقوم Application.LoadComponent بالخدعة بمفرده لأن هذه الإعدادات تتطلب تكاملًا مع الكود. تحتاج أيضًا إلى إيجاد طريقة لاستدعاء برنامج التحويل البرمجي BAML.
نظرًا لأن تكامل الكود-يتم تجميعه بالفعل في صفحتك أو فئة فرعية USERCONTROL ، هناك بعض القيود:
- لا يمكنك إضافة أو إزالة أو تغيير تسلسل مهام معالج الأحداث
- لا يمكنك تغيير أسماء أو تسلسل العناصر المسماة أو إضافة المزيد من العناصر المسماة
إذا كنت تلتزم بهذه القواعد ، فإن الكود الذي تم إنشاؤه بشكل عام تم دمجه في فئتك لن يتغير ، وبالتالي يمكنك تحميل ملف XAML الجديد إلى تطبيق تشغيل دون كسر أي شيء.
الإجراء هو:
- قم بتجميع ملف XAML إلى BAML إما عن طريق بناء المشروع المحتوي ، ب) إنشاء مشروع مؤقت وتجميع ذلك ، أو C) استدعاء مهام برنامج التحويل البرمجي مباشرة في برنامج العرض التقديمي.
- استخدم Application.LoadComponent لتحميل ملف BAML تمامًا كما فعلت لملف XAML المعدل في الحل الخالص.
في مشروع .csproj المترجمة ، سيتم العثور على أي ملفات BAML المترجمة تحت دليل OBJ/Debug أو OBJ/الإصدار مع امتداد .baml. إذا قمت بالاتصال بمهمة برنامج التحويل البرمجي Markup مباشرة ، فيمكنك تحديد موقع الإخراج.
ما هو ملف BAML؟
بالنسبة لأولئك الذين لا يعرفون ، فإن BAML هو في الأساس شكل ثنائي مضغوط ومحسّن من XAML ، وهو الطريقة التي يتم بها تخزين XAML داخل .exe أو .dll. كما أن لديها إمكانات لربطها مباشرة مع التعليمات البرمجية التي تم إنشاؤها ، والتي لا تملكها XAML.