C# tabControl/tabitem刷新困难

C# tabControl/tabitem刷新困难,c#,wpf,refresh,tabcontrol,C#,Wpf,Refresh,Tabcontrol,我有一个WPF窗口,有一个maintabWindow和几个tabitems。 它通常工作正常,布局如下: 但当我之前添加以下窗口时: 结果是: 因此,问题与tabControl/tabItem刷新有关。 这是相当明显的,但更重要的是,如果我在选项卡项上移动窗口或通过鼠标,它们会一个接一个地刷新 我搜索并发现以下是一个解决方案: 所以我补充说: this.MainTab.Refresh(); this.tabItem1.Refresh(); this.tabItem2.Refre

我有一个WPF窗口,有一个maintabWindow和几个tabitems。 它通常工作正常,布局如下:

但当我之前添加以下窗口时:

结果是:

因此,问题与tabControl/tabItem刷新有关。 这是相当明显的,但更重要的是,如果我在选项卡项上移动窗口或通过鼠标,它们会一个接一个地刷新

我搜索并发现以下是一个解决方案:

所以我补充说:

  this.MainTab.Refresh();
  this.tabItem1.Refresh();
  this.tabItem2.Refresh();
  this.tabItem3.Refresh();
  this.tabItem4.Refresh();
  this.tabItem5.Refresh();
但这并没有改变任何事情


谢谢你的帮助,好吧,最后它有一个很奇怪的行为。如果我这样做

for (int i = 0; i < tbcMain.Items.Count; i++)
  {
    tbcMain.SelectedIndex = i;
    tbcMain.UpdateLayout();
  }
没有。 因此,解决方案被置于睡眠状态,它再次起作用

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

  System.Threading.Thread.Sleep(250);
  tbcMain.SelectedIndex = 0;
for(int i=0;i
但这一点也不优雅。如果有更好的解决方案,请告诉我。
顺便说一句,添加tbcMain.SelectedIndex=0;在主窗口的已加载事件上没有任何用处。

您应该能够首先设置所选的索引,而不必将其包含在循环中:

tbcMain.SelectedIndex = 0;
MainTab.UpdateLayout();
for (int i = 0; i < tbcMain.Items.Count; i++)
{
    TabItem tbi = (TabItem)this.FindControl("tabItem"+i);
    tbi.UpdateLayout();
}
然后,根据您的回答,您应该能够在每个选项卡项上执行
.UpdateLayout()

MainTab.UpdateLayout();
tabItem1.UpdateLayout();
tabItem2.UpdateLayout();
tabItem3.UpdateLayout();
tabItem4.UpdateLayout();
tabItem5.UpdateLayout();
或者,您应该能够在循环中执行以下操作:

tbcMain.SelectedIndex = 0;
MainTab.UpdateLayout();
for (int i = 0; i < tbcMain.Items.Count; i++)
{
    TabItem tbi = (TabItem)this.FindControl("tabItem"+i);
    tbi.UpdateLayout();
}
关于为什么需要将其发送到
调度程序
,在一个单独的线程上有一篇文章/评论:

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


不过,不幸的是,我遇到了一个类似的问题,我试图刷新子选项卡上的列表视图。无论是
.UpdateLayout()
,还是
.InvalidateVisual()
(正如我在上所看到的)都不起作用。我只需要在主页上使用的按钮事件中重新绑定我的网格,以便在单击选项卡时手动刷新。我在选项卡上添加了一个
x:Name
属性,这样我就可以使用“点”语法调用它,并且它公开了ListView。我只是简单地将结果的DataTable添加回该ListView的DataContext。

您可以发布一些XAML吗?您可以尝试这样的方法:@Xcalibur37不起作用。但你提出的另一个解决方案可能不起作用。。。。作品所以无论如何谢谢你的帮助!!!!如果需要,您可以将其作为解决方案提出。编辑评论时被阻止。这个很好用。。。。对于(var i=0;imainTab.Update()帮了我的忙。不要添加
tbcMain.SelectedIndex=i在循环中。不需要。您可以直接执行
tabItem1.UpdateLayout()
tabItem2.UpdateLayout()等操作。如果要执行循环,只需将
i
附加到选项卡项名称。然后,您可以在末尾设置您的
。如您所做的那样,选择索引=0
,或者先设置它。