Pergunta

Eu estou fazendo uma imagem simples Debugger Visualizer. Código está abaixo. Eu não tenho certeza se eu precisar descartar manualmente da instância de imagem? Porque eu estou fazendo uma janela Form janelas eo PictureBox interior que contém a minha imagem dinâmica .. eu preciso adicionar um código especial quando o formulário está a terminar, para eliminar este?

aqui está o código ..

using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.DebuggerVisualizers;
using DebuggerVisualizers;

[assembly: DebuggerVisualizer(
    typeof (ImageDebuggerVisualizer),
    typeof (VisualizerObjectSource),
    Target = typeof (Image),
    Description = "Image Visualizer")]

namespace DebuggerVisualizers
{
    public class ImageDebuggerVisualizer : DialogDebuggerVisualizer
    {
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            Image image = (Image) objectProvider.GetObject();
            Form form = new Form
                           {
                               Text = ("Image Visualizer - " + image.HorizontalResolution + " " + image.VerticalResolution),
                               Width = image.Width,
                               Height = image.Height
                           };

            PictureBox pictureBox = new PictureBox {Image = image, SizeMode = PictureBoxSizeMode.AutoSize};
            form.Controls.Add(pictureBox);
            form.ShowDialog();
        }
    }
}

Obrigado por qualquer ajuda:)

Foi útil?

Solução

Alterar o seu método Show para o seguinte:

protected override void Show(IDialogVisualizerService windowService,
    IVisualizerObjectProvider objectProvider)        
{            
    Image image = (Image) objectProvider.GetObject();
    using (Form form = new Form())
    {            
        PictureBox pictureBox = new PictureBox();    
        pictureBox.Image = image;        
        form.Controls.Add(pictureBox); 
        form.ShowDialog();
    } 
}

O uso () {} bloco irá chamar Dispose no formulário depois que ele fecha, que irá dispor de tudo no formulário também.

Outras dicas

O controle de caixa de imagem não dispõe da imagem, de modo que este é com você, sim.

Hum, eu vou sair em um membro aqui e dizer que você não deve descartá-lo.

Eu nunca criou um visualizador, e eu não sei exatamente Visual Studio faz isso, mas parece-me que se você dispor de um objeto em um visualizador, você pode quebrar o código que você está depuração.

Tudo se resume a esta linha:

Image image = (Image) objectProvider.GetObject();

Se esse objeto não é um clone, então você será descartar o objeto criado pelo código que está sendo depurado. O código não vai estar esperando que objeto a ser subitamente eliminados, e S vai bater no ventilador, causando-lhe, pelo menos, ter que reiniciar o depuração.

Eu jogar pelo seguro e não descartá-lo. Pense nisso - depuração você está. Isso não é um processo de longa vida. Se você faz vazar um identificador de bitmap, não é o fim do mundo ...

Eu acho que você deve descartá-lo. Deve ser muito fácil, basta adicionar um usando () na primeira linha do seu método (ao redor da imagem Imagem = ... line) e terminá-la depois do form.ShowDialog ().

Eu acho que é seguro para eliminar a imagem, pois se você quiser mudar o objeto visualizado você deve chamar um dos métodos TransferData / TranferObject / ReplaceDat / ReplaceObject para enviá-lo de volta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top