سؤال

وأنا الحصول على هذا الخطأ:

لا يمكن استخدام DependencyObject ينتمي إلى موضوع مختلف عن الأم Freezable لها

وماذا يعني ذلك حتى؟ هل هو في اللغة الإنجليزية؟ هو الأصل المجمدة، أم أنها مجرد freezable؟ أي طريقة لجعل أحد الوالدين لا freezable، إذا ما يجعل الخطأ تذهب بعيدا؟

وماذا يحدث:

ولقد اثنين من برنامج OpenGL WinForms عناصر التحكم في التطبيق WPF، وحتى الآن، كل شيء تم بسلاسة (على ما أظن). الآن، واضاف لقد تحديثا بحيث عندما يستكمل السيطرة winform واحدة الصورة، والآخر يجب كذلك. التي استخدمت فعلا للعمل، والآن أنا الحصول على هذا الخطأ. التنقل خلال التعليمات البرمجية لديه تحطم يحدث في أماكن عشوائية، الأمر الذي يقودني إلى الاعتقاد أنه من الخطأ جمع القمامة (أي بعض التحديث في موضوع آخر هو خلق شيء ما يحصل القمامة التي تم جمعها، والذي جمع يحدث في وقت عشوائي).

ويتم اكتشاف الاستثناء في طريقة تشغيل الرئيسي، وانها InvalidOperationException.

وأنا استيعاب القش هنا. من أين أبدأ؟

وتحرير: يبدو ان الدعوة التي تتسبب في هذه المشكلة هو هذا واحد:

        if (imagePanel.InvokeRequired)
        {
            imagePanel.Invoke(new System.Windows.Forms.MethodInvoker(delegate{
                imagePanel.ClearImages();
            }));
        }
        else
        {
            imagePanel.ClearImages();
        }

وأنا لا تزال تتبع عليه. إذا علق بأن سلسلة من الخطوط خارج، وتحطم ما زال يحدث، ووضع موضوع يحتوي على موضوع "انتهت لتوها" (وبالتالي افتراض جمع القمامة).

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

المحلول

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

وكانت المشكلة مكالمة يشبه هذا:

ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...)));

if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) {
    button.background = theBrush;
}
else {
   labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate {
    button.background = theBrush;
   }));
}

ولكن! إذا كنت تفعل ذلك، ثم يعمل المرسل، وبعد ذلك يحاول حذف الفرشاة، ولكن أيضا على ما يبدو الحصول على حذف الفرشاة نفسها في موقع آخر.

وهكذا، فإن الدرس لأخذها إلى المنزل هو، إذا كنت تعلن ImageBrush، ثم حذفها في نفس الموضوع، كما يلي:

void MyFunc(){
     ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...)));
     button.background = theBrush;
}

if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) {
    MyFunc();
}
else {
   labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate {
       MyFunc();
   }));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top