أقوم بإنشاء وتطبيق يحتاج إلى إضافة وإزالة الكثير من 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.