Я не знаю ни одного более совершенного способа добиться этого, но, судя по тому, что вы долго искали решение, я вместе взломал что-то ужасное для вас, которое поможет.Сначала добавьте этот класс
public static class UIHelper
{
public static T FindChild<T>(this DependencyObject parent, string childName)
where T : DependencyObject
{
if (parent == null) return null;
T foundChild = null;
var childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (var i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
var childType = child as T;
if (childType == null)
{
foundChild = FindChild<T>(child, childName);
if (foundChild != null) break;
}
else if (!string.IsNullOrEmpty(childName))
{
var frameworkElement = child as FrameworkElement;
if (frameworkElement != null && frameworkElement.Name == childName)
{
foundChild = (T)child;
break;
}
}
else
{
foundChild = (T)child;
break;
}
}
return foundChild;
}
}
Этот класс найдет детей по имени.Я также собрал это, чтобы представить вашу ситуацию:
<TabControl Name="ImTheTabControl">
<TabItem Name="ImTheTab">
<Grid>
<TextBox Name="ImTheTextbox"></TextBox>
</Grid>
</TabItem>
<TabItem Name="ImNotTheTab"/>
<TabItem Name="ImNotTheTabEighter"/>
</TabControl>
теперь в вашем коде вызовите эту функцию с элементом управления, который содержит ошибку:
void findPapaTab(Control ctrl)
{
foreach (TabItem item in ImTheTabControl.Items)
{
if (null != UIHelper.FindChild<TextBox>(item.Content as Grid, ImTheTextbox.Name))
{
MessageBox.Show(item.Name);
}
}
}