Událost Drop   otázka

C#, WinForms

Zdravím, mám takový malý dotaz. Tvořím jednoduchou aplikaci, do které lze stylem drag&drop přesouvat soubory. Používám proto event Drop. Problém nastane tehdy, když přesunu soubory (např. z Plochy) a v obsluze události s nimi dělám časově náročnější operace -> při průběhu kódu metody je Plocha počítače "zaseknutá", neboť stále nebyla dokončena operace Drag&Drop. Rád bych se Vás proto zeptal, jak event ručně ukončit, nicméně ale chci, aby kód pokračoval v jiné metodě dále. Tj. Chci aby uživatel přetáhl soubory a ihned po přetažení je program začal zpracovávat a Plocha byla uvolněna. (Plocha byla vedena jako příklad, jedná se obecně o soubory odkudkoliv).

Zkoušel jsem to například řešit pomocí notifikačního rozhraní:

Při otevření MessageBox bych chtěl, aby byla zdrojová složka již uvolněna. V ukázkovém zdrojovém kódu tomu tak není.


namespace WpfApplication1
{
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public MainWindow()
        {
            this.AllowDrop = true;
            InitializeComponent();
            PropertyChanged += new PropertyChangedEventHandler(OnAppDragAndDropEvent);
        }

        private void OnAppDragAndDropEvent(object sender, PropertyChangedEventArgs args)
        {
            MessageBox.Show("Moje operace ...");        
        }

        private void Window_Drop(object sender, DragEventArgs e)
        {
            OnPropertyChanged("OnDrop");
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
    }
}

Děkuji za každou radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jako první bych zkusil tu časově náročnější operaci provádět ve vlastním vlákně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za typ, další vlákno mě také již napadlo, ale jako řešení se mi to moc nelíbilo.

Než se ale operace spustí, tak se ještě otevře dialog pro potvrzení a provede se ještě nějaká rutina, kterou bych rád stále prováděl v hlavním vlákně.

Například přetáhnu souboru -> otevře se dialog s možností, jestli chci soubory zpracovat či nikoliv a až po zvolené volbě se vytvoří nové vlákno, které začne vykonávat práci. Nicméně při zobrazení oné dialogové nabídky bych rád měl již uvolněnou zdrojovou složku souborů.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud přímo v Drag and Drop události zobrazujete MessageBox, nebo jinak blokujete hlavní vlákno aplikace, je jasné, že Plocha vytuhne dokud ho uživatel neodklikne.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To jsem trochu tušil. Ale napadlo mě, zda by nebylo možné, aby se před zobrazením MessageBoxu uvolnila alespoň Plocha ručním vyvoláním nějaké události, která ukončí Drag&Drop operaci. Můj dialog se zobrazí při vyvolání události OnProportyChange, která je zavolána bohužel v těle události Drag&Drop.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Volíte úplně špatný postup. V Drag and Drop události musí být co nejméně kódu, ideálně pouze uložení názvů souborů někam. Všechno ostatní mít v jiné metodě.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já v té metodě vykonávám minimum kódu. V podstatě jen vezmu názvy souborů. Ale po získání těchto názvů volám OnPropertyChange a ostatní části kódu, které jsou registrování u této události si spustí svůj obslužný kód.

Myslel jsem ale, že se po zavolání OnPropertyChange vyvolá nová událost, která se začne zpracovávat až v okamžiku dokončení události Drop. Tak tomu ale není.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nakonec jsem to udělal pomocí dalšího vlákna a funguje to dobře. Děkuji za všechny rady.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback