试图获取当前选定选项卡的子控件
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>
的代码。
希望这个回答能对您有所帮助
我正在尝试将 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>
的代码。
希望这个回答能对您有所帮助