2013-09-24 2 views
0

Моя программа в настоящий момент, похоже, работает до такой степени, что, когда работник фонового рисунка делает то, что он должен делать, пользовательский интерфейс остается отзывчивым, выполняя эту трудоемкую задачу. Хотя мне не удалось выяснить, как я должен обновлять Treeview, на данный момент мне нужно закрыть приложение и снова открыть его, чтобы обновленное Treeview было видимым. Я понимаю, что пользовательский интерфейс находится на отдельном потоке, и я попытался с помощью диспетчера, но не повезло ...Не удалось обновить пользовательский интерфейс после завершения фонового рисунка

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> 

И это Code-Behind для запуска обновления БД в комплекте с 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 
    } 

И это FolderView код в комплекте с 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"); 
     } 
    } 

Опять же, прошивка программы работает нормально, так как пользовательский интерфейс остается отзывчивым, когда выполняется много времени. Любая помощь будет оценена по достоинству.

+2

Совет: укажите минимальный код, необходимый для понимания того, что происходит. – Natxo

+0

Спасибо Natxo за совет, я упростил то, что я выражаю, надеюсь, что это облегчает чтение. –

ответ

-1

Я был рядом с диспетчером ... Это работает.

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

Теперь пользовательский интерфейс обновлен!

Смежные вопросы