Wpf backgroundworker完成后未能更新UI
我的程序目前似乎工作到了这样一个地步:backgroundworker正在做它应该做的事情,UI在执行这项耗时的任务时保持响应。虽然我还没有弄清楚应该如何更新Treeview,但目前我必须关闭应用程序并重新打开它,以使更新后的Treeview可见。我知道UI在一个单独的线程上,我尝试过使用dispatcher,但没有成功Wpf backgroundworker完成后未能更新UI,wpf,user-interface,treeview,backgroundworker,Wpf,User Interface,Treeview,Backgroundworker,我的程序目前似乎工作到了这样一个地步:backgroundworker正在做它应该做的事情,UI在执行这项耗时的任务时保持响应。虽然我还没有弄清楚应该如何更新Treeview,但目前我必须关闭应用程序并重新打开它,以使更新后的Treeview可见。我知道UI在一个单独的线程上,我尝试过使用dispatcher,但没有成功 Dispatcher.BeginInvoke( DispatcherPriority.Input, new Action(() => { //update U
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>
这是包含PropertyChangedEventHandler的FolderView代码:
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");
}
}
public event propertychangedventhandler PropertyChanged;
私有void OnPropertyChanged([CallerMemberName]字符串propertyName=”“)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共可观察集合子文件夹
{
收到
{
if(this.subFolders==null)
{
this.subFolders=新的ObservableCollection();
//this.subFolders.Clear();
DirectoryInfo[]di=this.folder.GetDirectories();
对于(int i=0;i
再一次,程序线程似乎工作正常,因为当执行耗时的任务时,UI保持响应。
任何帮助都将不胜感激。我与调度员关系密切。。。 这很有效
private void databaseWorker_DoWork(object sender, DoWorkEventArgs e)
{
....
Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() =>
{
folderView.Items.Refresh();
folderView.UpdateLayout();
}));
....
现在UI刷新了 建议:发布理解所需的最低代码。感谢Natxo的建议,我已经简化了我的内容,希望它更易于阅读。
private void databaseWorker_DoWork(object sender, DoWorkEventArgs e)
{
....
Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() =>
{
folderView.Items.Refresh();
folderView.UpdateLayout();
}));
....