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。