WPF: استبدل XAML من الصفحة أو USERCONTROL (كلاهما على ما يرام) في وقت التشغيل؟

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

  •  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 ، هناك بعض القيود:

  1. لا يمكنك إضافة أو إزالة أو تغيير تسلسل مهام معالج الأحداث
  2. لا يمكنك تغيير أسماء أو تسلسل العناصر المسماة أو إضافة المزيد من العناصر المسماة

إذا كنت تلتزم بهذه القواعد ، فإن الكود الذي تم إنشاؤه بشكل عام تم دمجه في فئتك لن يتغير ، وبالتالي يمكنك تحميل ملف XAML الجديد إلى تطبيق تشغيل دون كسر أي شيء.

الإجراء هو:

  1. قم بتجميع ملف XAML إلى BAML إما عن طريق بناء المشروع المحتوي ، ب) إنشاء مشروع مؤقت وتجميع ذلك ، أو C) استدعاء مهام برنامج التحويل البرمجي مباشرة في برنامج العرض التقديمي.
  2. استخدم Application.LoadComponent لتحميل ملف BAML تمامًا كما فعلت لملف XAML المعدل في الحل الخالص.

في مشروع .csproj المترجمة ، سيتم العثور على أي ملفات BAML المترجمة تحت دليل OBJ/Debug أو OBJ/الإصدار مع امتداد .baml. إذا قمت بالاتصال بمهمة برنامج التحويل البرمجي Markup مباشرة ، فيمكنك تحديد موقع الإخراج.

ما هو ملف BAML؟

بالنسبة لأولئك الذين لا يعرفون ، فإن BAML هو في الأساس شكل ثنائي مضغوط ومحسّن من XAML ، وهو الطريقة التي يتم بها تخزين XAML داخل .exe أو .dll. كما أن لديها إمكانات لربطها مباشرة مع التعليمات البرمجية التي تم إنشاؤها ، والتي لا تملكها XAML.

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