Попытка получить дочерний контроль на выбранной вкладке

Я пытаюсь отключить элемент управления 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 ответа

Решение

На самом деле я написал неправильную вещь в своем комментарии. 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, он возвращает ноль.

Как я уже говорил в моем предыдущем комментарии, вы можете найти здесь код GetChildOfType<T>,

Я надеюсь, что этот ответ может помочь вам.

При работе с WPF я обычно использую метод

   var currentTextEdit = tabControl.SelectedTab.Children.OfType<TextEditor>().First();
Другие вопросы по тегам