2011-11-14 19 views
6

Tengo una aplicación de winforms que usa un UserControl. El trabajo del control del usuario es recopilar un archivo que el usuario usa desde el Explorador de Windows, abrir el archivo, determinar el tipo y manejarlo en consecuencia.¿Por qué DragDrop no funciona en VS2010?

Este control funcionó PERFECTAMENTE en Visual Studio 2008 Pro. Me actualicé a VS 2010 Pro, y ahora, no funciona. ¿Hay una bandera o una propiedad que haya cambiado que yo deba conocer?

Hice una demostración rápida para probar. Esta demostración funciona perfectamente en 2008, pero no funciona en absoluto en 2010.

Configuración: cree un nuevo proyecto winform. Agregue un control de usuario. Establezca el siguiente código en la sección de código de control del usuario. (compilar para que aparezca el control del usuario en la caja de herramientas) Agregue el control de usuario al formulario. Ejecute el programa y arrastre CUALQUIER archivo de Windows al formulario. Si funciona, el área de control del usuario debería cambiar de color.

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 

     this.AllowDrop = true; 
     this.DragDrop += new DragEventHandler(UserControl1_DragDrop); 
     this.DragEnter += new DragEventHandler(UserControl1_DragEnter); 
     this.DragLeave += new EventHandler(UserControl1_DragLeave); 
    } 

    void UserControl1_DragLeave(object sender, EventArgs e) 
    { 
     this.BackColor = Color.FromName("Control"); 
    } 

    void UserControl1_DragEnter(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
     { 
      e.Effect = DragDropEffects.Copy; 
      this.BackColor = Color.Blue; 
     } 
     else 
     { 
      e.Effect = DragDropEffects.None; 
     } 
    } 

    void UserControl1_DragDrop(object sender, DragEventArgs e) 
    { 
     this.BackColor = Color.Yellow; 
    } 
} 

¡Estoy abierto a cualquier explicación o solución que ustedes puedan pensar!

ACTUALIZACIÓN:

he probado usando los comentarios que figuran a continuación. TODAVÍA no funciona. Sin embargo, he notado que solo falla en el entorno de desarrollo. Cuando voy al directorio bin e inicio el programa manualmente, funciona bien. Simplemente no funciona cuando estoy en el entorno de desarrollo, lo que hace que la depuración sea un poco difícil. Todavía estoy buscando la solución a la gran imagen.

+0

Pasa de gris a azul en vuelo estacionario y amarillo en gota en VS 2010 pro para mí. (Solo para tu información). – KreepN

+0

Eso es lo que DEBE hacer. ¡¡¡Muy raro!!! Me pregunto si mi VS2010 es tostada o algo así. Todo lo demás funciona a la perfección. Gracias por probarme. Hiciste NADA diferente a la configuración anterior? ¿Hay otros switches/flags/propiedades habilitados? – Jerry

+0

Pegué el código textualmente en un control de usuario, lo agregué a un panel que reside en un formulario en form_load y luego lo probé. No se tocaron propiedades Podría ser que al agregarlo de la caja de herramientas, esto lo haga actuar de forma divertida. Como mencioné lo agregué programáticamente: UserControl1 uc1 = new UserControl1(); this.panel1.Controls.Add (uc1); – KreepN

Respuesta

13

Una posible causa de error aquí es UIPI, el componente de interfaz de usuario de UAC. No puede arrastrar desde un proceso no elevado y colocarlo en una ventana propiedad de un proceso elevado. Activarás esto cuando hayas iniciado Visual Studio desde un acceso directo que tenga la opción "Ejecutar este programa como administrador" en la pestaña Compatibilidad activada. La única solución es desactivar esa opción. O para ejecutarlo directamente desde el archivo .exe, como descubriste.

+0

Holy crap !! Eso fue todo. Tuve que hacerlo "administrador" debido a otro control que había agregado recientemente que necesitaba escribir en el registro. Muchas gracias. Me estaba volviendo loco. – Jerry

+0

@Hans ¿Conoce una forma de iniciar una aplicación con privilegios estándar de Visual Studio bajo privilegios de administrador? – d11

+0

Utilice Debugger.Launch() en Main() para que pueda iniciar el programa desde Explorer y obtener un depurador conectado después de que se inició. –

Cuestiones relacionadas