2010-08-15 53 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