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