【发布时间】:2013-08-23 18:49:21
【问题描述】:
我有一个带有 3 个控件的用户窗口 - 一个“执行”按钮、一个结果控件和一个处理控件。我的目标是在按下执行后显示处理控件,然后在执行方法完成时将其隐藏。
但是,当我认为处理控件会显示时,它不会显示...相反,它仅在(如果)创建另一个提示用户输入的窗口的回调函数被调用时显示。
处理控件的可见性通过 BoolToVis 转换器绑定到我的视图模型中的 bool Processing。 execute 方法在开始时将Processing 设置为 true,然后在结束时设置为 false。 Processing 的 setter 调用 OnPropertyChanged. 我的视图模型实现了 INotifyPropertyChanged.
private bool _processing;
public bool Processing
{
get
{ return _processing; }
set
{
_processing = value;
this.OnPropertyChanged("Processing");
}
}
private RelayCommand _search;
public RelayCommand Search
{
get { return _search ?? (_search = new RelayCommand(p => OnSearch(), p => CanSearch())); }
}
private void OnSearch()
{
this.Processing = true;
DoWork(delegate callBack);
this.Processing = false;
}
还有一些 XAML:
<BooleanToVisibilityConverter x:Key="BoolToVis" />
<me:ProcessingControl Visibility="{Binding Path=Processing, Converter={StaticResource ResourceKey=BoolToVis}}"/>
【问题讨论】:
-
您可能需要在后台线程中执行
DoWork()方法,方法是使用来自 TPL 的BackgroundWorker或Task<T>,或者如果您使用的是 C# 5 (VS 2012 ) 你可以在上面await。 -
我会试试的。然而,我的好奇心仍然存在。控制流不应该通过 OnPropertyChanged 并在到达 DoWork() 之前更新 UI 吗?
-
不,因为您让 UI 线程忙于执行您的 DoWork() 方法,因此在您的代码完成执行之前它无法刷新 UI。
-
+1,这正是我实现弹出窗口的方式,除了任何和所有同步耗时的工作都应该在
BackgroundWorker中进行。将您的工作方法订阅到后台工作人员的DoWork事件并设置Processing = true。然后为RunWorkerCompleted订阅一个整理方法,你应该在其中设置Processing = false。 -
@HighCore,我建议您添加您的 cmets 作为答案并让 Michael 接受。
标签: c# wpf multithreading