tabControl / tabitem刷新困难

我有一个带有maintabWindow的WPF窗口和几个tabitems。 它通常工作正常,布局是这样的:

在此处输入图像描述

但是当我在添加以下窗口时:

在此处输入图像描述

结果是这样的:

在此处输入图像描述

所以问题与tabControl / tabItem刷新有关。 这是相当明显的,但更多的是因为如果我移动窗口或使用鼠标在tabItem上传递它们会逐个刷新。

我搜索并发现这是一个解决方案: http : //geekswithblogs.net/NewThingsILearned/archive/2008/08/25/refresh–update-wpf-controls.aspx

所以我补充说:

this.MainTab.Refresh(); this.tabItem1.Refresh(); this.tabItem2.Refresh(); this.tabItem3.Refresh(); this.tabItem4.Refresh(); this.tabItem5.Refresh(); 

但这并没有改变一件事。

Thanx任何帮助

好吧,最后它有一个非常奇怪的行为。 如果我做

 for (int i = 0; i < tbcMain.Items.Count; i++) { tbcMain.SelectedIndex = i; tbcMain.UpdateLayout(); } 

有用。 但是如果我添加的话,我必须设置第一个tabitem

  tbcMain.SelectedIndex = 0; 

它没有。 所以解决方案是睡眠,它再次起作用。

 for (int i = 0; i < tbcMain.Items.Count; i++) { tbcMain.SelectedIndex = i; tbcMain.UpdateLayout(); } System.Threading.Thread.Sleep(250); tbcMain.SelectedIndex = 0; 

但这根本不优雅。 如果有人有更好的解决方案请让我知道。 顺便说一下,添加tbcMain.SelectedIndex = 0; 在mainWindow的加载事件是没有用的。

您应该能够首先设置SelectedIndex,而不必将其包含在循环中:

 tbcMain.SelectedIndex = 0; 

然后,基于您的响应,您应该能够在每个.UpdateLayout()上执行.UpdateLayout()

 MainTab.UpdateLayout(); tabItem1.UpdateLayout(); tabItem2.UpdateLayout(); tabItem3.UpdateLayout(); tabItem4.UpdateLayout(); tabItem5.UpdateLayout(); 

或者你应该能够在你的循环中做这样的事情:

 MainTab.UpdateLayout(); for (int i = 0; i < tbcMain.Items.Count; i++) { TabItem tbi = (TabItem)this.FindControl("tabItem"+i); tbi.UpdateLayout(); } 

更新/刷新应与设置选定的更新/刷新无关。 包括循环中选项卡的选择是i的问题 - 不是竞争条件 。 在循环外设置tbcMain.SelectedIndex = 0 ,你应该没问题。 但是,有时这不起作用,您需要使用Dispatcher进行设置:

 Dispatcher.BeginInvoke((Action)(() => this.tbcMain.SelectedIndex = 0)); 

有关为什么需要将其发送到Dispatcher的单独线程上有一个写/评论:

如何以编程方式选择WPF TabControl中的TabItem

虽然,不幸的是,我有一个类似的问题,我试图在子选项卡上刷新ListView。 既没有.UpdateLayout() ,也没有.InvalidateVisual() (就像我在这个线程上看到的那样)。 我只需要在我的主页上使用的按钮事件中重新绑定网格,这样当单击选项卡时,它会手动刷新。 我在选项卡上添加了一个x:Name属性,所以我可以使用“dot”语法调用它,它暴露了ListView。 我只是将DataTable的结果添加回ListView的DataContext。