سؤال

أقوم بإنشاء وتطبيق يحتاج إلى إضافة وإزالة الكثير من UIElement إلى Canvas. أساسا أ Canvas يحتوي على مجموعة من UIElement ويقوم تلقائيًا بإعداد/تحديثه على الشاشة اعتمادًا على ما يحتويه.

من أجل تجنب وجود طن من UIElements الذين يتداخلون مع بعضهم البعض على الشاشة ، أفضل أن أضيفها جميعًا على ثانوية Canvas ثم إنشاء Image منه (بفضل WritableBitmap). أخيرا أضيف هذا Image على الحالي Canvas. من خلال السماح بأن يكون لديك سوى القليل من الصور على اللوحة الخاصة بي ، أتوقع الحصول على أداء أفضل. للأسف يبدو أنني لا أستطيع حذف تماما WritableBitmap, ، حتى لو قمت بتعيينها على null.

يوضح ذلك الرمز التالي:

//My constructor
public  WP8Graphics() 
{
    //Here my collection DataBinded with the Canvas from the Mainpage
    this.UIElements = new ObservableCollection<UIElement>();
    //The secondary Canvas
    GraphicCanvas = new Canvas();
    GraphicCanvas.Height = MainPage.CurrentCanvasHeight;
    GraphicCanvas.Width = MainPage.CurrentCanvasWidth;
}


///This method can be hit thousand times, it basically create a rectangle 
public void fillRect(int x, int y, int width, int height)
{

// some code
// CREATE THE RECTANGLE rect

   GraphicCanvas.Children.Add(rect); // My secondary Canvas



   WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);
   wb1.Invalidate();

   WriteableBitmap wb2 = new WriteableBitmap((int)MainPage.CurrentCanvasWidth, (int)MainPage.CurrentCanvasHeight);

  for (int i = 0; i < wb2.Pixels.Length; i++)
  {
       wb2.Pixels[i] = wb1.Pixels[i];
  }
  wb2.Invalidate();

  wb1 = null;

  Image thumbnail = new Image();
  thumbnail.Height = MainPage.CurrentCanvasHeight;
  thumbnail.Width = MainPage.CurrentCanvasWidth;
  thumbnail.Source = wb2;



  this.UIElements.Add(thumbnail);

}

بعد شيء مثل 24 WriteableBitmap خلقت OutOfMemoryException يبدو. قرأت العديد من المقالات حول هذه المشكلة وفي حالتي يبدو WriteableBitmap يعتمد على بلدي GraphicCanvas ويبقى لأنه لا يزال هناك إشارة إليها. لا يمكنني حذف قماش الرسم الخاص بي أو تعيينه صورتي مصدر للاختراء.

لدي سؤالان:

  • هل هناك طريقة أخرى لإنشاء صورة من قماش أو مجموعة من uielements؟
  • هل من الممكن إزالة المرجع الذي يحافظ على هذا crinablebitmap على قيد الحياة؟

آمل أن أكون واضحًا وسهل القراءة.

شكرا لقرائتك.

تم تحريره مع اقتراح Atomaras ، ولكن لا يزال نفس المشكلة

WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);هذا الخط لا يزال يلقي OutofMemoryException.

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

المحلول

تحتاج إلى نسخ وحدات البكسل الخاصة بـ OriginalableBitMap (والتي ستتمسك بـ GraphicsCanvas) إلى خاب واحد جديد.

ألق نظرة على هذا المنشور الرائع http://www.wintellect.com/blogs/jprosise/silverlight-s-big-image-problem-and-what-you-can-do-about-it

أيضا لماذا تحتفظ بجميع منافسات brintable في مجموعة UieIeMement؟ ألن يكفي الأحدث؟ ألا تستطيع مسح مجموعة UiEilements مباشرة قبل إضافة أحدث صورة نقطية/جديدة؟

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