【问题标题】:Delete a Tab Item based off of its header根据标题删除选项卡项
【发布时间】:2013-08-19 08:42:31
【问题描述】:

首先,这个问题是this question 的后续问题。我觉得我的问题只回答了一半。

除了删除Name 引用的tabItems,我还需要能够通过引用他们的Headers 来删除tabItems

实现我的答案并将n.Name 更改为n.Header 时,如下所示:

var tabToDelete = tabControl.Items.OfType<TabItem>().SingleOrDefault(n => n.Header == stringValue);
if (tabToDelete != null) 
tabControl.Items.Remove(tabToDelete);

我发现它的工作方式不一样。这应该可行,还是我需要编辑整个结构?如果是这样,我将如何确保我需要的 tabItemHeader 引用?

新增:当Name引用的标签被删除时,它们会从屏幕上移除,而Header引用的标签不会(直到您手动切换标签)。这使我认为它们仍然存在于程序中。

【问题讨论】:

    标签: c# wpf header tabitem


    【解决方案1】:

    你的问题是Header 是一个对象而不是一个字符串。您正在比较这两个值,但因为 Header 是一个对象,您实际上是在进行参考比较,而不是值比较。您只需在Header 上调用.ToString() 即可将Header 转换为字符串。

    var tabToDelete = tabControl.Items.OfType<TabItem>().SingleOrDefault(n => (n.Header as string) == stringValue);
    if (tabToDelete != null)
        tabControl.Items.Remove(tabToDelete);
    

    如果这不能解决问题,您可以通过调用强制控件重绘

    tabControl.Refresh();
    

    更新

    感谢 Daniel Gimenez 发现可能的空引用异常。将Header 设置为控件的问题不是问题,因为所有对象都可以调用ToString(),真正的问题是如果根本没有设置Header,则会导致null 对象。

    【讨论】:

      【解决方案2】:

      就像 Ryan 说的,问题在于 Header 可以是一个控件,而不仅仅是文本。如果Header 可以是nullas StringConvert.ToString() 将比toString() 更好,因为它们都可以处理从空值转换而ToString() 产生异常。

      使用Convert.ToString() 可能有点矫枉过正,但如果您的标头绑定到无法隐式转换为字符串的值,例如整数,那么使用Convert.ToString() 将能够处理它们。如果存在多个具有相同标题值的项目,此解决方案也将处理这种情况。

      private void RemoveTabByHeader(string str) 
      {
          TabsMain.Items.OfType<TabItem>().Where(t => Convert.ToString(t.Header) == str)
             .ToList().ForEach(t => TabsMain.Items.Remove(t));
      }
      

      这是经过测试的。 TabControl 正确更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 2022-01-04
        • 2021-06-05
        相关资源
        最近更新 更多