wpf drag drop show - PullRequest
       1

wpf drag drop show

0 голосов
/ 16 августа 2010

Я сделал программу в wpf c #.Я сделал обработчик перетаскивания, который добавляет некоторые элементы в список.Пока программа это делает (это занимает некоторое время), я хочу, чтобы Grid изменил видимость своего свойства на видимую, и я хочу обновить текстовое поле, чтобы показать пользователю, какой файл обрабатывается.Код выглядит следующим образом:

ОБНОВЛЕНИЕ: Реализация решения Попробуйте

            BackgroundWorker bgWorker = new BackgroundWorker(); 
private void Dropaudio(object sender, System.Windows.DragEventArgs e) 
{ 


    bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); 
    bgWorker.ProgressChanged +=  
        new ProgressChangedEventHandler(bgWorker_ProgressChanged); 
    bgWorker.WorkerReportsProgress = true; 
    this.Drop += new DragEventHandler(Dropaudio);
    if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
    { 
        string[] droppedFilePaths =  
            e.Data.GetData(DataFormats.FileDrop, true) as string[]; 
        List<string> Jobs = new List<string>(droppedFilePaths); 
        bgWorker.RunWorkerAsync(Jobs); 
    } 
} 

void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    if (e.ProgressPercentage == 0) 
    { 
        Addingcues.Visibility = Visibility.Visible; 
    } 
    addcuepath.Text = e.UserState.ToString(); 
} 

void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    List<string> Jobs = e.Argument as List<string>; 
    bgWorker.ReportProgress(0, "Processing Data"); 
    double count = 0; 
    double total = Jobs.Length; 
    foreach (string droppedFilePath in Jobs) 
    {                 
        if (System.IO.Path.GetExtension(droppedFilePath) == ".mp3" ||  
            System.IO.Path.GetExtension(droppedFilePath) == ".wav" ||  
            System.IO.Path.GetExtension(droppedFilePath) == ".flac") 
        { 
            double pct = count / total; 
            // Report this file 
            bgWorker.ReportProgress((int) (pct * 100), droppedFilePath); 
            var provider = (XmlDataProvider)this.Resources["CUEData"]; 
            XmlDocument xmlcuelijst = provider.Document;
            XmlNode cueshow = xmlcuelijst.SelectSingleNode("CUEShow");
            XmlNode maincues = cueshow.SelectSingleNode("Maincues");
            XmlElement Maincue = xmlcuelijst.CreateElement("Maincue");
            XmlElement nr = xmlcuelijst.CreateElement("nr");
            XmlElement Description = xmlcuelijst.CreateElement("Description");
            XmlElement Cuetype = xmlcuelijst.CreateElement("Cuetype");
            XmlElement Name = xmlcuelijst.CreateElement("Name");
            XmlElement Path = xmlcuelijst.CreateElement("Path");
            XmlElement Duration = xmlcuelijst.CreateElement("Duration");
            XmlElement Type = xmlcuelijst.CreateElement("Type");
            XmlElement Fade = xmlcuelijst.CreateElement("Fade");
            XmlElement Fadein = xmlcuelijst.CreateElement("Fadein");
            XmlElement Fadeout = xmlcuelijst.CreateElement("Fadeout");
            XmlElement Delay = xmlcuelijst.CreateElement("Delay");
            XmlElement Delaytime = xmlcuelijst.CreateElement("Delaytime");
            XmlElement Loop = xmlcuelijst.CreateElement("Loop");
            XmlElement FX = xmlcuelijst.CreateElement("FX");
            XmlElement Filename = xmlcuelijst.CreateElement("Filename");
            Maincue.AppendChild(nr);
            Maincue.AppendChild(Cuetype);
            Maincue.AppendChild(Name);
            Maincue.AppendChild(Path);
            Maincue.AppendChild(Description);
            Maincue.AppendChild(Duration);
            Maincue.AppendChild(Type);
            Maincue.AppendChild(Fade);
            Maincue.AppendChild(Fadein);
            Maincue.AppendChild(Fadeout);
            Maincue.AppendChild(Delay);
            Maincue.AppendChild(Delaytime);
            Maincue.AppendChild(Loop);
            Maincue.AppendChild(FX);

            count += 1; 
        } 
    } 

} 

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    Addingcues.Visibility = Visibility.Hidden; 
}

Это работает (изменил массив в список), но при действиях Appendchild код просто внезапно останавливается, я установилдве точки останова в первой и второй строке Appendchild, и первая срабатывает, но вторая не ...

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Трудно точно сказать, для чего этот код требует Invoke / BeginInvoke - похоже, что метод Dropaudio - это просто обработчик событий (в потоке GUI).

Пожалуй, самое простое - это использовать BackgroundWorker, который разработан для упрощения простой многопоточности.

class MyClass
{
    BackgroundWorker bgWorker = new BackgroundWorker();

    public MyClass()
    {
        bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
        bgWorker.ProgressChanged += 
            new ProgressChangedEventHandler(bgWorker_ProgressChanged);
        bgWorker.WorkerReportsProgress = true;
        this.Drop += new DragEventHandler(Dropaudio);
    }

    private void Dropaudio(object sender, System.Windows.DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            string[] droppedFilePaths = 
                e.Data.GetData(DataFormats.FileDrop, true) as string[];
            List<string> Jobs = new List<string>(droppedFilePaths);
            bgWorker.RunWorkerAsync(Jobs);
        }
    }

    void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        if (e.ProgressPercentage == 0)
        {
            Addingcues.Visibility = Visibility.Visible;
        }
        addcuepath.Text = e.UserState.ToString;
    }

    void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        string[] Jobs = e.Argument as string[];
        bgWorker.ReportProgress(0, "Processing Data");
        double count = 0;
        double total = Jobs.Count;
        foreach (string droppedFilePath in Jobs)
        {                
            if (System.IO.Path.GetExtension(droppedFilePath) == ".mp3" || 
                System.IO.Path.GetExtension(droppedFilePath) == ".wav" || 
                System.IO.Path.GetExtension(droppedFilePath) == ".flac")
            {
                double pct = count / total;
                // Report this file
                bgWorker.ReportProgress((int) (pct * 100), droppedFilePath);
                var provider = (XmlDataProvider)this.Resources["CUEData"];
                XmlDocument xmlcuelijst = provider.Document;
                // Do other stuff from above
                count += 1;
            }
        }

    }

    void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Addingcues.Visibility = Visibility.Hidden;
    }       
}

Обратите внимание, что вы можете легко добавить ProgressBar при использовании события ProgressChanged. Я предполагаю, что «Addingcues» - это элемент управления, который вы хотите видеть во время обработки, а «addcuePath» - это текстовое поле (TextBlock?), Которое вы хотите обновить с прогрессом.

1 голос
/ 16 августа 2010

Вместо выполнения BeginInvoke, которое запускает действие в асинхронном потоке и продолжает обработку, используйте вызов Invoke, который выполняется синхронно в том же потоке (т. Е. Ожидает завершения обработки, прежде чем продолжить).

Джон Скит объясняет это лучше в этом посте , чем я мог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...