Microsoft-ui-xaml: الاقتراح: غيّرت خاصية الإرسال التلقائي الأحداث إلى مؤشر ترابط واجهة المستخدم

تم إنشاؤها على ١٧ مايو ٢٠١٩  ·  3تعليقات  ·  مصدر: microsoft/microsoft-ui-xaml

ملخص

السماح بحدوث ارتباطات واجهة المستخدم من الخصائص التي تثير تغييرات الإشعارات من أي مؤشر ترابط غير تابع لواجهة المستخدم

المنطق

عندما تقوم بربط الخصائص ، يجب عليك دائمًا رفع إشعار تغيير الخاصية على UI Thread ، أو ستحصل على استثناء وقت التشغيل. يتسبب هذا في تسرب واجهة المستخدم إلى نماذج ونماذج العرض الخاصة بك ، بحيث يمكنك رفع الخيط المناسب ، والذي بدوره يمنعك من استخدام INPC من مكتبة .NET Standard (إلا إذا كنت ترغب في الدخول إلى bait'n'switch) .

بالإضافة إلى ذلك ، قد يكون لديك خصائص تتغير عدة مرات خلال إطار واحد ، لذلك من المحتمل أن تقفز إلى UI Thread مرات عديدة أكثر مما هو مطلوب بالفعل (كل ما هو مطلوب هو وضع علامة على الخاصية على أنها "قذرة" ، وسيتم انتقاؤها في تمرير العرض التالي.

كل هذا يسبب تعقيدًا إضافيًا في التعليمات البرمجية بشكل كبير ويكون أكثر عرضة للخطأ.

يتسبب أيضًا في حدوث مشكلة في WinUI 3.0 ، لأن لدينا الآن خيطين لواجهة المستخدم: ترابط UWP القديم و WinUI: أيهما يجب أن أقوم بإثارته؟

مجال

  • يجب أن تكون قادرًا على رفع INotifyPropertyChanged و INotifyCollectionChanged على أي موضوع
  • يجب أن تكون قادرًا على القيام بذلك بثمن بخس عدة مرات في إطار ، ولكن فقط تشغيل تحديث واحد (آخر تحديث في الانتصارات)
  • يجب أن تكون قادرًا على التعامل مع خاصية يتم تعيينها أثناء قراءتها لتحديث واجهة المستخدم.
  • يتجنب التبديل إلى مؤشر ترابط واجهة المستخدم إذا كان موجودًا بالفعل.

ملاحظات هامة

مخاوف الخيوط صحيحة بالطبع ، لكنني لا أعتقد أن هذه مشكلة حقيقية في النهاية. لا يهم أن العديد من أحداث INPC تنطلق قبل تحديث واجهة المستخدم ، لأن الحدث الأخير فقط هو الذي سيهم على الإطلاق. لن يختلف هذا عن رمز التبديل الحالي إلى سلسلة واجهة المستخدم عدة مرات. بمجرد أن يتحول الأول إلى UI Thread ، يمكن أن يكون قد تم تحديث الخاصية عدة مرات بالفعل ، وبالتالي آخر واحد في الانتصارات.
بطبيعة الحال ، يجب أن يكون هناك قفل قصير عند قراءة القيمة التي تمنع تعيين العلامة القذرة ، لذلك تحدث جولة ثانية من تحديثات واجهة المستخدم في الإطار التالي ، في حالة تحديث الخاصية في نفس الوقت الذي تتم قراءته فيه.
في الواقع ، إذا تغيرت قيمة على سبيل المثال من false ، إلى true ، والعودة إلى false ، فإن خاصية Dependency تكون بالفعل ذكية بما يكفي لاكتشاف أن القيمة لم تتغير ، ويمكن تحسينها من خلال عدم التسبب في تمرير عرض جديد بسبب الخاصية عدم التغيير.

feature proposal team-Markup

التعليق الأكثر فائدة

هذا مصدر قلق صحيح جدًا ، شكرًا لك على رفعه. قد لا يكون دعم تقارب الخيط لـ DPs في إطار العمل مشكلة كبيرة ، ولكن قد يكون جيدًا جدًا لمنفذي INPC.

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

هناك أيضًا أكبر مشكلة تواجه INPC ، وهي عدم وجود القيمة "الحالية" عند رفع الحدث. يمكن أن تكون هناك مواقف لا تتم فيها مزامنة الخصائص بشكل صحيح ، (على سبيل المثال ، SelectedIndex و ItemsSource لا يتم تحديثهما بشكل متزامن و SelectedIndex يفقد قيمته) ، أو مع ping-pongs للتغييرات الناتجة عن حالات الخاصية (مثل تغييرات TextBox وعوامل تصفية regex).

يؤدي هذا بعد ذلك إلى ظهور المشكلات مع INCC ، حيث تحتاج المجموعة بأكملها إلى الحماية بشكل صحيح. على سبيل المثال ، يمكنك رفع حدث يشير إلى عنصر تم نقله أو لم يعد موجودًا.

أنا لا أقول أنه لا يوجد حل لهذه المشكلة (هناك بالتأكيد) ولكن مستمعي IPNC الذين يقومون بتغييرات التقارب لا يكفي لجعل هذه المشكلة سهلة على طرفي الواجهة.

ال 3 كومينتر

هذا مصدر قلق صحيح جدًا ، شكرًا لك على رفعه. قد لا يكون دعم تقارب الخيط لـ DPs في إطار العمل مشكلة كبيرة ، ولكن قد يكون جيدًا جدًا لمنفذي INPC.

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

هناك أيضًا أكبر مشكلة تواجه INPC ، وهي عدم وجود القيمة "الحالية" عند رفع الحدث. يمكن أن تكون هناك مواقف لا تتم فيها مزامنة الخصائص بشكل صحيح ، (على سبيل المثال ، SelectedIndex و ItemsSource لا يتم تحديثهما بشكل متزامن و SelectedIndex يفقد قيمته) ، أو مع ping-pongs للتغييرات الناتجة عن حالات الخاصية (مثل تغييرات TextBox وعوامل تصفية regex).

يؤدي هذا بعد ذلك إلى ظهور المشكلات مع INCC ، حيث تحتاج المجموعة بأكملها إلى الحماية بشكل صحيح. على سبيل المثال ، يمكنك رفع حدث يشير إلى عنصر تم نقله أو لم يعد موجودًا.

أنا لا أقول أنه لا يوجد حل لهذه المشكلة (هناك بالتأكيد) ولكن مستمعي IPNC الذين يقومون بتغييرات التقارب لا يكفي لجعل هذه المشكلة سهلة على طرفي الواجهة.

لقد توصل WPF إلى هذا الأمر ، لذا ربما مجرد سحب الحل من هناك؟

اقتراح رائع. نحن نفعل هذا لأحداث CollectionChanged (نوعًا ما عن طريق الصدفة ...) ، يجب أن نكون قادرين على فعل الشيء نفسه مع NotifyPropertyChanged.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات