Pergunta

Estou executando uma linha de código que não executa no designer, fazendo com que todas as propriedades públicas do meu controle não apareçam mais no designer. Por isso, não consigo mais ver nenhum dos meus formulários que usam esse controle na visualização do Visual Studios.

A linha de código em questão chama um projeto de código inseguro que faz um pouco de processamento de imagem; Comentar isso faz com que a visualização do design volte à vida. No entanto, o código é executado perfeitamente, então não consigo ver por que o código falha no designer. Este é o código que está sendo chamado:

        /// <summary>
        /// Performs a color adjustment on the source bitmap. 
        /// </summary>
        /// <param name="source">The bitmap to be processed. This is changed by the
        /// process action.</param>
        /// <param name="redChange">change to the red value. Can be negative.</param>
        /// <param name="greenChange">change to the green value. Can be negative.</param>
        /// <param name="blueChange">change to the blue value. Can be negative.</param>
        /// <returns></returns>
        public static Bitmap ProcessColor(Bitmap source, int redChange, int greenChange, int blueChange)
        {
            sourceBitmap = source;

            // lock the source bitmap
            sourceBitmapData = getBitmapData(sourceBitmap, ref sourceWidth);
            sourcepBase = (Byte*)sourceBitmapData.Scan0.ToPointer();

            PixelData* pPixel;

            for (int y = 0; y < source.Height; y++)
            {
                pPixel = (PixelData*)(sourcepBase + y * sourceWidth);
                for (int x = 0; x < source.Width; x++)
                {
                    int redVal = pPixel->red + redChange;
                    if ( redVal <0 ) redVal = 0;
                    if ( redVal > 255) redVal = 255;
                    pPixel->red = (byte)redVal;

                    int greenVal = pPixel->green + greenChange;
                    if ( greenVal <0 ) greenVal = 0;
                    if ( greenVal > 255) greenVal = 255;
                    pPixel->green = (byte)greenVal;

                    int blueVal = pPixel->blue + blueChange;
                    if (blueVal < 0) blueVal = 0;
                    if (blueVal > 255) blueVal = 255;
                    pPixel->blue = (byte)blueVal;

                    pPixel++;
                }
            }

            sourceBitmap.UnlockBits(sourceBitmapData);
            sourceBitmapData = null;
            sourcepBase = null;

            return source;
        }

(Cortesia da comunidade OpenNetCF)

Meu projeto não é marcado como inseguro, mas o projeto em que o código acima está é marcado sem seguro. Ambos os projetos precisam ser marcados inseguros?

Ou existe uma maneira de bloquear essa linha de disparo de código no designer (na verdade não preciso da saída desse código enquanto estiver na exibição de design, pois está apenas gerando uma versão desativada de uma imagem a partir de uma imagem fornecida).

Editar: bloquear o código da execução não corrige o problema. Somente comentando a linha permite que a visualização do design funcione. Ter a linha (mesmo quando colocado em uma instrução if [false == true]) faz com que o designer exiba erros, em vez do formulário.

Foi útil?

Solução

Enrole a parte do código em if:

if(!DesignMode)
{
    // Your "unsafe" code goes here
}

Se você estiver usando a estrutura compacta, use isso:

if(Site != null && !Site.DesignMode)
{
    // Your "unsafe" code goes here
}

Ver esta postagem no modo informações sobre o que uma besta DesignMode na verdade é.

Outras dicas

Eu não criei isso, mas pensei em adicionar um truque útil encontrado -> Aqui <-.

Basta adicionar isso ao seu controle e usá -lo adequadamente.

public static bool IsDesignMode
{
  get 
  { 
    return AppDomain.CurrentDomain.FriendlyName.Contains("DefaultDomain"); 
  }
}

Ou para nós, vb.net, pessoal:

  Public Shared ReadOnly Property IsDesignMode() As Boolean
    Get
      Return AppDomain.CurrentDomain.FriendlyName.Contains("DefaultDomain")
    End Get
  End Property
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top