我有一个带有maintabWindow和几个tabitems的WPF窗口。 它通常工作正常,布局是这样的:
但是当我在添加以下窗口时:
结果如下:
所以问题与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任何帮助
答案 0 :(得分:2)
好吧,最后它有一个非常奇怪的行为。如果我做
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的加载事件上是没有用的。
答案 1 :(得分:0)
您应该能够首先设置SelectedIndex,而不必将其包含在循环中:
tbcMain.SelectedIndex = 0;
然后,根据您的回复,您应该能够在每个TabItem上执行.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
循环中选择选项卡是您的问题 - 而不是race condition。在你的循环之外设置tbcMain.SelectedIndex = 0
,你应该没事。但是,有时这不起作用,您需要使用Dispatcher
:
Dispatcher.BeginInvoke((Action)(() => this.tbcMain.SelectedIndex = 0));
关于为什么需要将其发送到Dispatcher
的单独帖子有一个写/评论:
How to programmatically select a TabItem in WPF TabControl
虽然不幸的是,我有一个类似的问题,我试图在子选项卡上刷新ListView。 .UpdateLayout()
和.InvalidateVisual()
(我在this thread上看到的)都没有奏效。我只需要在我的主页面上使用的按钮事件中重新绑定网格,这样当单击选项卡时,它会手动刷新。我在选项卡上添加了x:Name
属性,因此我可以使用“dot”语法调用它,并公开ListView。我只是将DataTable的结果添加回ListView的DataContext。