【问题标题】:Difficulty with tabControl/tabitem refreshtabControl/tabitem 刷新困难
【发布时间】:2016-03-02 16:36:37
【问题描述】:

我有一个带有 maintabWindow 和几个 tabitem 的 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();

但这并没有改变任何事情。

感谢任何帮助

【问题讨论】:

  • 能否请您发布一些 XAML?
  • 你可以试试这样的:xcalibursystems.com/tag/tab-control
  • @Xcalibur37 唉,不工作。但是您提出的其他解决方案可能不起作用....有效。所以无论如何谢谢你的帮助!!!!如果您愿意,可以将其作为解决方案提出。
  • 在编辑评论时被阻止。这个工作正常.... for (var i = 0; i
  • 我遇到了类似的问题。 mainTab.Update() 帮了我的忙。

标签: c# wpf refresh tabcontrol


【解决方案1】:

您应该可以先设置 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 的单独线程上有一篇文章/cmets:

How to programmatically select a TabItem in WPF TabControl

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

【讨论】:

    【解决方案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 的加载事件上是没有用的。

    【讨论】:

    • 不要在循环中添加tbcMain.SelectedIndex = i;。这不是必需的。你可以直接做tabItem1.UpdateLayout()、tabItem2.UpdateLayout()等。如果你想做一个循环,只需将i 附加到 TabItem 名称。然后你在最后设置你的.SelectedIndex = 0,就像你做的那样,或者先设置它。
    猜你喜欢
    • 2020-04-05
    • 2018-04-21
    • 2012-09-07
    • 2021-03-30
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多