在后面的代码中使用<tabitem.header>时如何访问控件?</tabitem.header>

时间:2014-04-17 22:07:52

标签: c# wpf xaml tabitem

在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时,就好像标题是按照上面第二个标签的方式定义的那样。

2 个答案:

答案 0 :(得分:2)

我同意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查找第一个标签的可视子项...

但是 ...再一次,您应该使用数据绑定,所以我要确保您在进一步采取行动之前遵循良好的模式。

答案 1 :(得分:0)

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

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