Domanda

Sto riscontrando un problema trascinando un file da Esplora risorse in un'applicazione Windows Form.

Funziona bene quando trascino il testo, ma per qualche motivo non riconosce il file. Ecco il mio codice di prova:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_DragDrop(object sender, DragEventArgs e)
        {

        }

        private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.Text))
            {
                e.Effect = DragDropEffects.Copy;
            }
            else if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.Copy;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
    }
}

AllowDrop è impostato su true su Form1 e, come ho già detto, funziona se trascino il testo sul modulo, non solo un file reale.

Sto usando Vista 64-bit ... non sono sicuro che sia parte del problema.

È stato utile?

Soluzione

Il problema deriva dal UAC di Vista. DevStudio è in esecuzione come amministratore, ma explorer è in esecuzione come utente normale. Quando si trascina un file da explorer e lo si rilascia sull'applicazione ospitata DevStudio, è lo stesso di un utente non privilegiato che tenta di comunicare con un utente privilegiato. Non è permesso.

Questo probabilmente non verrà visualizzato quando si esegue l'app al di fuori del debugger. A meno che non venga eseguito come amministratore lì (o se Vista rilevi automaticamente che si tratta di un'app di installazione / configurazione).

Potresti anche eseguire explorer come amministratore , all'indirizzo almeno per i test. Oppure disabilita Controllo account utente (che non consiglierei, dal momento che vuoi davvero capire questi problemi durante lo sviluppo, non durante la distribuzione!)

Altri suggerimenti

Il codice che hai pubblicato dovrebbe funzionare.

Prova a metterlo all'inizio del metodo DragEnter

string formats = string.Join( "\n", e.Data.GetFormats(false) );
MessageBox.Show( formats );

che scaricherà i formati di dati associati all'operazione d'n'd. Potrebbe aiutarci a restringere la posizione del problema.

Ho aggiunto il codice che arul menzionato e le cose non hanno ancora funzionato, ma mi ha fatto pensare.

Ho iniziato a pensare che potesse essere un problema di Vista, quindi l'ho inviato a un amico che aveva Windows XP e funzionava alla grande! Ho quindi provato a eseguirlo al di fuori della cartella Release nella directory bin e cosa sai che ha funzionato!

L'unica volta che non funziona è quando lo eseguo nell'IDE di Visual Studio 2008 ... è solo strano.

Hai provato ad aggiungere l'attributo STAThread al metodo principale?

  [STAThread]
  static void Main(string[] args)
  {
  }

Ho avuto lo stesso problema di @mattruma, il che significa che non ho ricevuto eventi Drag & amp; Dopo aver aggiunto l'attributo STAThread al metodo principale ha funzionato come previsto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top