尝试获取当前所选选项卡的子控件

时间:2015-11-03 20:53:20

标签: c# wpf parent-child tabcontrol

我试图从我的标签控件中删除当前所选标签的TextEditor控件。选项卡和文本编辑器是动态创建的,因此简单地引用文本编辑器不是一个选项。我搜索得很远,到目前为止,没有任何答案对我有帮助。

以下代码适用于Winforms,但不适用于WPF:

var currentTextEdit = tabControl.SelectedTab.Controls.OfType<TextEditor>().First();

这些问题中是否有某些东西可能是我错过了?

这就是我创建每个标签并为每个创建的标签添加TextEditor控件的方法:

TabControl itemsTab = (TabControl)this.FindName("tabControl");
TextEditor textEdit = new TextEditor();

然后创建新标签并添加文本编辑器:

TabItem newTab = new TabItem();
newTab.Content = textEdit;
itemsTab.Items.Add(newTab);

在代码的下方,我得到了当前选中的标签,如下所示:

TabItem ti = tabControl.SelectedItems as TabItem;

使用GetChildOfType扩展方法,我试图像这样获取当前的文本编辑器:

var currentTextEditor = ti.GetChildOfType<TextEditor>();

此代码返回NullReferenceException:

File.WriteAllText(saveF.FileName, currentTextEditor.Text);

2 个答案:

答案 0 :(得分:0)

使用WPF时,我通常使用方法

collect(Report::new, Report::add, Report::add)

答案 1 :(得分:0)

事实上,我在评论中写了一个不对的东西。与其他控件进行比较时,TabControl的工作方式略有不同。它有一个TabItems的集合。 TabControl可以显示属于其集合的每个TabItem的每个标题。 同时TabControl“抓取”选定的TabItem的内容并将其添加到其ContentPresenter(它被称为PART_SelectedContentHost - 只需使用ILSpy)。

因此,回到您的问题,您必须直接在TextEditor中搜索TabControl。然后你可以使用这段代码:

TabControl itemsTab = (TabControl)FindName("tabControl");
TextEditor currentTextEditor = itemsTab.GetChildOfType<TextEditor>();
if (currentTextEditor != null)
{
    File.WriteAllText(saveF.FileName, currentTextEditor.Text);
}

您应该始终检查从GetChildOfType<T>方法获取的对象是否为空,因为如果GetChildOfType<T>找不到类型为T的控件,则返回null。

正如我在之前的评论中所说,您可以找到GetChildOfType<T>代码<a href="#" class="lightbox_button" data-box="#lightbox" data-panel="#lightbox_panel"> <div class="button" >button</div> </a>

我希望这个答案可以帮到你。