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保持响应。 任何帮助,将不胜感激。
建议:发布最小代码以了解发生了什么。 – Natxo
感谢Natxo的建议,我简化了我的建议,希望它更易于阅读。 –