使用<;TabItem.Header>;,在代码背后

本文关键字:代码 背后 Header lt TabItem 使用 gt | 更新日期: 2023-09-27 17:58:54

在TabControl:下从MSDN中删除此示例

<TabControl>
    <TabItem>
    <TabItem.Header>
      <StackPanel Orientation="Horizontal">
        <Ellipse Width="10" Height="10" Fill="DarkGray"/>
        <TextBlock>Tab 1</TextBlock>
      </StackPanel>
    </TabItem.Header>
    <StackPanel>
      <TextBlock>Enter some text</TextBlock>
      <TextBox Name="textBox1" Width="50"/>
    </StackPanel>
  </TabItem>
  <TabItem Header="Tab 2">
    <!--Bind TextBlock.Text to the TextBox on the first
    TabItem.-->
    <TextBlock Text="{Binding ElementName=textBox1, Path=Text}"/>
  </TabItem>
</TabControl>

如何从C#代码后面访问<TabItem.Header>标记内的stackpanel(及其子级)?当我尝试使用.Header时,intellisense将其视为标题是按照上面第二个选项卡的方式定义的。

使用<;TabItem.Header>;,在代码背后

我同意HighCore的观点。您应该使用数据绑定,而不是直接操作UI元素。如果你不想坚持你目前的计划,下面是如何做到的:

<TabControl>
    <TabItem>
    <TabItem.Header>
      <StackPanel Name="tab1StackPanel" Orientation="Horizontal">
        ...
      </StackPanel>
    </TabItem.Header>        
  </TabItem>
  <TabItem Header="Tab 2">
    ...
  </TabItem>
</TabControl>

现在,从代码隐藏中,您可以直接引用tab1StackPanel,因为定义Name会将其暴露给代码隐藏WPF(只要它不在模板中)。

您也可以使用VisualTreeHelper来查找第一个选项卡的可视子项…

但是。。。再说一次,你可能应该使用数据绑定,所以在做得太多之前,我会确保你遵循了一个好的模式。

我不知道它是否有效,但你可以试试:

(tabItem.Header as ContentControl).FindName("NAME_OF_TEXTBLOCK");