试图获取当前选定选项卡的子控件

Attempting to get child control of currently selected tab

我正在尝试将 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>();

此代码returns NullReferenceException:

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

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

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

我的评论确实写错了。 TabControl 与其他控件相比,工作方式略有不同。它的 collection 为 TabItems。 TabControl 可以显示属于其 collection 的每个 TabItem 的每个 header。 同时 TabControl "grabs" 选定的 TabItem 的内容并将其添加到它的 ContentPresenter (它被称为 PART_SelectedContentHost - 只需使用 ILSpy)。

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

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

你应该经常检查你从 GetChildOfType<T> 方法获得的 object 是否不为空,因为如果 GetChildOfType<T> 找不到类型为 T 的控件,它 returns null.

正如我在之前的评论中所说,您可以找到 here GetChildOfType<T> 的代码。

希望这个回答能对您有所帮助