2013-05-13 58 views
1

我有一个ListBox,它包含一个StackPanel其中包含一个Image和一个TextBlock。我想通过c#(代码隐藏)来访问TextBlock以手动更改它的字体。如何访问列表框中的StackPanel中的元素

培训相关XAML:

<ListBox x:Name="CategoriesListBox" Margin="0,0,-12,0" ItemsSource="{Binding Categories}" SelectionChanged="CategoriesListBox_SelectionChanged" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Margin="0,0,0,17" Width="432" Height="62"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="40"/> 
           <ColumnDefinition Width="*"/> 
          </Grid.ColumnDefinitions> 
          <Image x:Name="catImage" Source="{Binding icon}"/> 
          <TextBlock x:Name="catName" Grid.Column="1" Text="{Binding name_shown}" TextWrapping="Wrap" Style="{StaticResource PhoneTextLargeStyle}"/> 
         </Grid> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

我需要访问 “catName” TextBlock所有单元。

回答

3

试试这个--->

private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject 
{ 
    var count = VisualTreeHelper.GetChildrenCount(parentElement); 
    if (count == 0) 
     return null; 

    for (int i = 0; i < count; i++) 
    { 
     var child = VisualTreeHelper.GetChild(parentElement, i); 

     if (child != null && child is T) 
     { 
      return (T)child; 
     } 
     else 
     { 
      var result = FindFirstElementInVisualTree<T>(child); 
      if (result != null) 
       return result; 

     } 
    } 
    return null; 
} 

u能以这种方式--->使用上述方法

ListBoxItem item = this.list.ItemContainerGenerator.ContainerFromIndex(2) as ListBoxItem; 
TextBlock txt = FindFirstElementInVisualTree<TextBlock>(item); 
txt.Text = "some text"; 
+0

谢谢,成功了! – Jimmar 2013-05-13 08:51:30