如何在 TabItem 中查找控件

  • 本文关键字:查找 控件 TabItem wpf
  • 更新时间 :
  • 英文 :


我想在 TabItem 中找到一个控件。使用查找名称是不可能的。我找到了一种遍历可视化树的方法,但这看起来相当麻烦。为什么 FindName 不做这项工作?

XAM:

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Button
Content="Click"
Click="Button_Click"
/>
<TabControl Grid.Row="1" x:Name="tabControl">
<TabControl.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBox
x:Name="textBox"
Text="{Binding DataContext.Message, ElementName=mainWindow}"
/>
</StackPanel>
</DataTemplate>
</TabControl.ContentTemplate>
<TabItem Header="One" />
<TabItem Header="Two" />
<TabItem Header="Three" />
</TabControl>
</Grid>

代码隐藏:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
TabControl tabControl = FindName("tabControl") as TabControl;
TextBox textBox = FindName("textBox") as TextBox;
TabItem tabItem = tabControl.SelectedItem as TabItem;
textBox = tabItem.FindName("textBox") as TextBox;
}
}

"textBox"为空,无论是从顶部搜索还是从选定的选项卡项搜索。

TextBox不是TabItem的视觉子项。如果您查看可视化树,您将看到当前所选选项卡的内容托管在TabControlControlTemplate的一部分ContentPresenter中。

不过,这应该有效:

private void Button_Click(object sender, RoutedEventArgs e)
{
ContentPresenter cp = tabControl.Template.FindName("PART_SelectedContentHost", tabControl) as ContentPresenter;
TextBox textBox = cp.ContentTemplate.FindName("textBox", cp) as TextBox;
}

相关内容

  • 没有找到相关文章

最新更新