我有一个带有maintabWindow和几个标签项的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();但这并没有改变任何事情。
感谢您的帮助
发布于 2015-12-01 05:39:48
好的,所以在最后它有一个相当奇怪的行为。如果我这样做了
for (int i = 0; i < tbcMain.Items.Count; i++)
{
tbcMain.SelectedIndex = i;
tbcMain.UpdateLayout();
}它起作用了。但是我必须设置第一个选项卡项,所以如果我添加
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;但这一点也不优雅。如果有人有更好的解决方案,请让我知道。顺便说一下,在mainWindow的loaded事件上添加tbcMain.SelectedIndex = 0;是没有用的。
发布于 2017-01-13 00:50:02
您应该能够首先设置SelectedIndex,而不必将其包含在循环中:
tbcMain.SelectedIndex = 0;然后,基于您的响应,您应该能够对每个TabItems执行.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属性,以便可以使用“点”语法调用它,并且它公开了ListView。我只是将结果的DataTable添加回该ListView的DataContext。
https://stackoverflow.com/questions/33974939
复制相似问题