Canvas WPF: الأطفال. add () معلقة على موضوع الخلفية؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

...أو...

"ما الشر في أعماق WPF التي استيقظت؟"

أقوم بإنشاء قماش على خيط خلفية وأعرضه على صورة نقطية. لقد عملت هذا في رمز الإنتاج لأكثر من عام الآن دون مشاكل. أفعل ما يلي:

  • إنشاء كائن قماش
  • إنشاء كائن Namescope جديد
  • قم بتعيين تلك الأسماء إلى القماش
  • ارسم ما أريده على القماش
  • call canvas.measic () مع حجم القماش
  • Call Canvas.arrage () مع المستقيم المتاح من القماش
  • Call Canvas.updatelayout ()
  • جعل القماش

في خطوة السحب ، كنت دائماً أدعو Canvas.Children.Add () لوضع UiEilements على القماش. لقد نجح هذا دائمًا.

الآن ، لسبب ما لا يمكن تفسيره ، في حالة واحدة محددة في التطبيق الذي أعمل عليه ، فإن الدعوة إلى canvas.children.add () معلقة بشكل غير محدد ، وتمنع خيط الخلفية الخاص بي. لا أستطيع التفكير في أي شيء أقوم به بشكل مختلف بين الكود الذي كان يعمل لأكثر من عام ، وهذه الحالة المحددة.

هل يمكن لأي شخص أن يقترح أسبابًا محتملة لدعوة Canvas.Children.Add () معلقة مثل هذا؟

يحرر: مؤشر ترابط الخلفية هو مؤشر ترابط STA (تم وضع نموذج معالجة مؤشر ترابط الخلفية لأنني لم أستطع معالجة الصور باستخدام WPF على مؤشر ترابط MTA) ، لذلك يجب ألا يكون نموذج شقة الخيط هو الجاني.

تحرير #2: على الرغم من أنني أفهم لماذا يقترح الناس أنني أحاول مرسلًا.

  1. أريد أن تكون معالجة موضوع الخلفية متزامنة في هذا الموضوع. يحتوي موضوع الخلفية الخاص بي على قائمة انتظار تقوم بتقديم مواضيع أخرى إلى وظائف الصورة ، ويقوم مؤشر ترابط الخلفية الخاص بي بمعالجة كل وظيفة عند وصولها إليها. باستخدام dispatcher.begininvoke () يضيف طبقة أخرى من التعقيد الذي أفضل تجنبه.
  2. لم اقم ابدا اللازمة ل حتى الآن. القيام بهذه المعالجة الخلفية هذه بشكل متزامن على موضوع الخلفية الخاص بي ، إلا أن الأمر سهل عمل. أحاول تحديد ما يمكن أن يكون مختلفًا عن حالة الحافة الغريبة التي تسبب هذا الرمز في عدم عمله. إذا لم أتمكن من العمل ، فسوف ينتهي بك الأمر إلى إعادة كتابة رمز المعالجة هذا بدون WPF ، وهو ما أفضل تجنبه أيضًا.
هل كانت مفيدة؟

المحلول

ما هو نموذج الشقة الذي تستخدمه لخيط الخلفية الخاص بك؟

أعتقد أن WPF يحتاج إلى تشغيل موضوع STA. عندما تفرخ خيط الخلفية ، جرب الإعدادات الشقة إلى Sta.

تحديث:

إذا لم يكن موضوع STA هو المشكلة ، فسأحاول كسر القماش الخاص بك إلى قطع. في الأساس إذا قمت بذلك:

Dispatcher.begininvoke (...)

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

تحديث 2:

يمكنك أيضًا محاولة تصحيح الأخطاء في الكود المصدري لكائن قماش باستخدام مصادر مرجع .NET Framework. يمكنك تمكين ذلك عن طريق تشغيل "تمكين .NET Framework Source STEPPING" في خيارات تصحيح الأخطاء تحت الأدوات>.

نصائح أخرى

حاول استدعاء Dispatcher.run () في موضوع الخلفية.

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