2013-09-24 65 views
0

目前,我的程序似乎正在开展工作,即后台工作人员正在执行其应执行的操作,因为UI在执行耗时的任务时仍保持响应。虽然我一直无法弄清楚我应该如何更新Treeview,但现在我必须关闭应用程序并再次打开它,以便更新后的Treeview可见。据我所知,UI是在单独的线程,并且我一直在使用调度,但没有运气试图...未能在完成Backgroundworker后更新UI

Dispatcher.BeginInvoke(
DispatcherPriority.Input, new Action(() => 
{ 
    //update UI 
})); 

这是TreeView的XAML:

<TreeView x:Name="folderView" Grid.Column="0" Grid.Row="1" BorderThickness="0"> 
      <TreeViewItem Header="Folders" ItemsSource="{Binding SubFolders, Source={StaticResource RootFolderDataProvider}}" Margin="5"/> 

      <TreeView.Resources> 
       <HierarchicalDataTemplate DataType="{x:Type my:FolderView}" ItemsSource="{Binding SubFolders}"> 
        <StackPanel Orientation="Horizontal" Name="myPanel"> 
         <Image x:Name="img" Width="16" Height="16" Source="Images/FolderClosed.png" /> 
         <TextBlock Text="{Binding Name}" /> 
        </StackPanel> 

        <HierarchicalDataTemplate.Triggers> 
         <DataTrigger Binding="{Binding IsExpanded, RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}" Value="True"> 
          <Setter TargetName="img" Property="Source" Value="Images/FolderOpen.png"/> 
         </DataTrigger> 
        </HierarchicalDataTemplate.Triggers> 
       </HierarchicalDataTemplate>  
      </TreeView.Resources> 
     </TreeView> 

这是代码隐藏用于运行数据库更新完成的BackgroundWorker:

 private void cmdUpdate_Click(object sender, RoutedEventArgs e) 
    { 
      if (backgroundWorker_Database.IsBusy != true) 
       { 
        backgroundWorker_Database.RunWorkerAsync(qMaker); 
       } 
      } 
    private void databaseWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 

       //start the time-consuming process 

     } 
    } 
    private void databaseWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
      //An error was thrown by the DoWork event handler 
      MessageBox.Show(e.Error.Message, "An Error Occured"); 
     } 
     else 
     { 
      MessageBox.Show("Update of Database is Completed!"); 
     } 
     cmdUpdate.IsEnabled = true; 
     cmdThumbnails.IsEnabled = true; 
     cmdOriginals.IsEnabled = true; 
    } 

    private void databaseWorker_progressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     //Update the UI Treeview 
    } 

这是文件夹视图代码完成PropertyChangedEventHandler:

public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 


    public ObservableCollection<FolderView> SubFolders 
    { 
     get 
     { 
      if (this.subFolders == null) 
      { 
       this.subFolders = new ObservableCollection<FolderView>(); 
       //this.subFolders.Clear(); 

       DirectoryInfo[] di = this.folder.GetDirectories(); 

       for (int i = 0; i < di.Length; i++) 
       { 
        FolderView newFolder = new FolderView(); 
        newFolder.FullPath = di[i].FullName; 
        this.subFolders.Add(newFolder); 
       } 
      } 
      return this.subFolders; 
     } 
     set 
     { 
      this.subFolders = value; OnPropertyChanged("SubFolders"); 
     } 
    } 

再次,程序线程似乎工作正常,因为当执行耗时的任务时,UI保持响应。 任何帮助,将不胜感激。

+2

建议:发布最小代码以了解发生了什么。 – Natxo

+0

感谢Natxo的建议,我简化了我的建议,希望它更易于阅读。 –

回答

-1

我离调度员很近...... This works。

private void databaseWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
     .... 
     Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() => 
     { 
      folderView.Items.Refresh(); 
      folderView.UpdateLayout(); 
     })); 
     .... 

现在UI已刷新!

相关问题