我正在尝试将一个子控件(UserControl
)添加到Grid
,并且这些更改没有反映出来。但是,如果将另一个子控件(UserControl
)添加到同一网格中,则布局会更新,并且两个子项都可见。此操作在按钮单击时执行。
/*this Operation is perform in Backgroud Worker */
void func()
{
/*adding first User Control*/
addRemoveChild(true,FirstChild);//even tried to run this fuc with Dispatcher
FixButton();
addRemoveChild(false,FirstChild);
}
void addRemoveChild(bool isAdd,UserControl uc)
{
if (isAdd)
{
parentGrid.Children.Add(uc); /*parentGrid is Parent Grid*/
parentGrid.UpdateLayout();
return;
}
else
{
parentGrid.Children.Remove(uc);
parentGrid.UpdateLayout();
}
}
void FixButton()
{
/* here some operation is perform which takes 5 min to complete till then FirstChild is not visible*/
addRemoveChild(true,secondChild); /*When this Func run the first Child is visible*/
}
答案 0 :(得分:3)
您的功能是在后台工作程序中执行的:在Dispatcher Thread中没有完成。每次使用Dispatcher对象(由Dispatcher线程创建的对象,如Controls)时,您都应该在Dispatcher线程中。
后台工作程序可用于执行任务并在"实时"中相对于任务的状态更新UI。
您没有正确使用后台工作程序。 DoWork中的代码在单独的线程中执行,而ProgressChanged回调在Dispatcher线程中执行。
您的代码应如下所示:
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (sender, args) => {
bw.ReportProgress(0);
FixButton();
bw.ReportProgress(100);
};
bw.ProgressChanged += (sender, args) => {
if (args.ProgressPercentage == 0) {
parentGrid.Children.Add(uc);
} else if(args.ProgressPercentage == 100) {
parentGrid.Children.Remove(uc);
}
};
bw.RunWorkerAsync();
顺便说一下,你不需要调用UpdateLayout(),你的DoWork回调函数永远不应该使用Dispatcher对象(从FixButton函数中删除addRemoveChild)