Estou criando e aplicação que precisa adicionar e remover muito UIElement
para um Canvas
. Basicamente um Canvas
contém uma coleção de UIElement
e renderiza/atualiza automaticamente na tela, dependendo do que ela contém.
Para evitar ter toneladas de UIElements
que se sobrepõem na tela, prefiro adicionar todos eles em um secundário Canvas
Em seguida, crie um Image
a partir disso (graças a WritableBitmap
). Finalmente eu acrescento isso Image
na minha corrente Canvas
. Ao permitir ter apenas poucas imagens na minha tela, espero ter melhor desempenho. Infelizmente parece que não posso excluir completamente o WritableBitmap
, mesmo que eu o defina para null
.
O código a seguir ilustra:
//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);
}
Depois de algo como 24 WriteableBitmap
Criou um OutsMemoryException parece. Eu li muitos artigos sobre esse problema e, no meu caso, parece o WriteableBitmap
depende do meu GraphicCanvas e permanece porque ainda há uma referência a ele. Não consigo excluir minha tela gráfica nem definir minha imagem fonte para nulo.
Eu tenho 2 perguntas:
- Existe outra maneira de criar uma imagem a partir de tela ou uma coleção de uielamentos?
- É possível remover a referência quem mantém esse writeablebitmap vivo?
Espero ser suficientemente claro e fácil de ler.
Obrigado pela leitura.
Editado com sugestão de Atomaras, mas ainda assim o mesmo problema
WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);
Essa linha ainda lança outOfMemoryException.