tabControl / tabitem刷新困难

时间:2015-11-28 18:33:38

标签: c# wpf refresh tabcontrol

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

enter image description here

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

enter image description here

结果如下:

enter image description here

所以问题与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任何帮助

2 个答案:

答案 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。