首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tabControl/tabitem刷新困难

tabControl/tabitem刷新困难
EN

Stack Overflow用户
提问于 2015-11-29 02:33:38
回答 2查看 9.7K关注 0票数 3

我有一个带有maintabWindow和几个标签项的WPF窗口。它通常工作得很好,布局如下:

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

结果是这样的:

所以这个问题与tabControl/tabItem刷新有关。这很明显,但更重要的是,如果我移动窗口或在tabItem上使用鼠标通过,它们会一个接一个地刷新。

我搜索了一下,发现这里有一个解决方案:http://geekswithblogs.net/NewThingsILearned/archive/2008/08/25/refresh--update-wpf-controls.aspx

所以我补充道:

代码语言:javascript
复制
  this.MainTab.Refresh();
  this.tabItem1.Refresh();
  this.tabItem2.Refresh();
  this.tabItem3.Refresh();
  this.tabItem4.Refresh();
  this.tabItem5.Refresh();

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

感谢您的帮助

EN

回答 2

Stack Overflow用户

发布于 2015-12-01 05:39:48

好的,所以在最后它有一个相当奇怪的行为。如果我这样做了

代码语言:javascript
复制
for (int i = 0; i < tbcMain.Items.Count; i++)
  {
    tbcMain.SelectedIndex = i;
    tbcMain.UpdateLayout();
  }

它起作用了。但是我必须设置第一个选项卡项,所以如果我添加

代码语言:javascript
复制
 tbcMain.SelectedIndex = 0;

它不会。所以解决方案是让它睡眠,然后它又起作用了。

代码语言:javascript
复制
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;是没有用的。

票数 2
EN

Stack Overflow用户

发布于 2017-01-13 00:50:02

您应该能够首先设置SelectedIndex,而不必将其包含在循环中:

代码语言:javascript
复制
tbcMain.SelectedIndex = 0;

然后,基于您的响应,您应该能够对每个TabItems执行.UpdateLayout()

代码语言:javascript
复制
MainTab.UpdateLayout();
tabItem1.UpdateLayout();
tabItem2.UpdateLayout();
tabItem3.UpdateLayout();
tabItem4.UpdateLayout();
tabItem5.UpdateLayout();

或者你应该能够在你的循环中做这样的事情:

代码语言:javascript
复制
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对其进行设置

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33974939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档