查找LongListSelector Windows手机的子控件
本文关键字:控件 手机 LongListSelector Windows 查找 | 更新日期: 2023-09-27 18:29:44
我试图找到LongListSelector
的子元素。这是我的UI
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="ItemTemplate">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Photo}" Height="100" Width="100"/>
<StackPanel>
<TextBlock FontFamily="Segoe UI Semilight" Padding="9" Foreground="#313131" Width="330" TextWrapping="Wrap" Name="lblMessage" Text="{Binding Message}" FontSize="26" />
<Button HorizontalAlignment="Left" Width="130" FontFamily="Segoe UI Semilight" BorderThickness="0.5" BorderBrush="#D62429" Content="Button1" Foreground="#313131"></Button>
<Button Margin="15,-65,0,0" Width="120" FontFamily="Segoe UI Semilight" BorderThickness="0.5" BorderBrush="#D62429" Content="Button2" Foreground="#313131"></Button>
</StackPanel>
<StackPanel>
<RadioButton Name="Rdb1"/>
<RadioButton Name="Rdb2"/>
</StackPanel>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="ListHeader">
<Border Background="#D62429" Opacity="0.8" Height="50">
<TextBlock Name="txtHeader" Text="Long List Header" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black" FontFamily="Segoe UI Semilight"/>
</Border>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--<Grid x:Name="gvHeader" Width="480" Height="70" Grid.Row="0" Canvas.ZIndex="1"></Grid>-->
<!--Pivot Control-->
<phone:Pivot Grid.Row="1" Name="pivotItems" Title="Welcome">
<phone:PivotItem FontFamily="Segoe WP Light" Header="item1">
<Grid x:Name="item2" Grid.Row="1">
<phone:LongListSelector ItemsSource="{Binding ListModel}" x:Name="longListSelector"
IsGroupingEnabled="True" LayoutMode="List" HideEmptyGroups="False"
ListHeaderTemplate="{StaticResource ListHeader}"/>
</Grid>
</phone:PivotItem>
<!--Pivot item two-->
<phone:PivotItem Header="item2">
</phone:PivotItem>
</phone:Pivot>
</Grid>
在这里我想找到ListHeader
的TextBlock
控件。我使用此代码查找控件。但什么都没得到。
TextBlock txtBlockHeader = FindFirstElementInVisualTree<TextBlock>(this.longListSelector.ListHeaderTemplate);
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;
}
如何从ListHeader
中找到TextBlock
?我的代码出了什么问题?
这是因为ListHeaderTemplate
返回数据模板。正如其名称所示,数据模板是一个模板:一个指示应该构建什么控件以及如何构建控件的蓝图。这不是实际的控制。
我不知道实例化的模板是否可以在LongListSelector中访问。但是,您可以使用ListHeader
来解决这个问题:
<phone:LongListSelector ItemsSource="{Binding ListModel}" x:Name="longListSelector"
IsGroupingEnabled="True" LayoutMode="List" HideEmptyGroups="False"
ItemTemplate="{StaticResource ItemTemplate}">
<phone:LongListSelector.ListHeader>
<Border Background="#D62429" Opacity="0.8" Height="50">
<TextBlock Name="txtHeader" Text="Long List Header" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black" FontFamily="Segoe UI Semilight"/>
</Border>
</phone:LongListSelector.ListHeader>
</phone:LongListSelector>
然后,您可以使用相同的ListHeader
属性调用您的方法:
FindFirstElementInVisualTree<TextBlock>((FrameworkElement)this.longListSelector.ListHeader);
或者直接使用文本框的名称:
this.txtHeader.Text = "Hello world!";