2010-08-15 60 views
0

我在wpf c#中製作了一個程序。 我做了一個拖放處理程序,它將一些項目添加到列表框中。雖然程序正在這樣做(這需要一些時間),但我希望Grid將其屬性可見性更改爲可見,並且我想更新文本框以顯示用戶正在處理的文件。代碼如下:wpf拖放顯示處理彈出

UPDATE:解決方案的實施儘量

  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行,第一個被觸發,但第二個不被觸發...

回答

1

很難確切地說出這段代碼需要什麼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; 
    }  
} 

請注意,使用ProgressChanged事件時,您可以輕鬆添加ProgressBar。我假設「Addingcues」是您希望在處理過程中可見的控件,「addcuePath」是您想要更新進度的文本框(TextBlock?)。

1

而不是做一個BeginInvoke,它啓動異步線程上的Action並繼續處理,使用一個Invoke調用,它同步執行同一個線程(即在繼續之前等待完成處理)。

喬恩Skeet解釋它更好in this post比我能。

+0

我試過這個,但問題仍然存在...... – internetmw 2010-08-17 18:06:48

+0

看看你的代碼上面 - 是Dropaudio方法只是事件處理程序?如果是的話,是什麼讓這個多線程? – 2010-08-17 19:02:19

+0

它只是事件處理程序,我試過你的解決方案,但我不希望它在一個單獨的類。現在,我只是聲明一個新的後臺工作人員,並在drop eventhandler中應用您的代碼,網格顯示但沒有任何反應 – internetmw 2010-08-17 20:12:13