【问题标题】:Find child controls of LongListSelector Windows phone查找 LongListSelector Windows phone 的子控件
【发布时间】:2013-09-01 07:49:47
【问题描述】:

我试图找到LongListSelector 的子元素。这是我的用户界面

<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>

这里我想找到ListHeaderTextBlock控件。我使用此代码来查找控件。但没有得到任何东西。

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?我的代码有什么问题?

【问题讨论】:

    标签: c# windows-phone-8 visualtreehelper


    【解决方案1】:

    那是因为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!";
    

    【讨论】:

    • 当我将 ItemSource 设置为 longListSelector 时效果很好。但是当我没有设置ItemSource时它不起作用,它没有显示标题。
    • @Ajay 但是当你没有设置ItemSource并使用ListHeaderTemplate而不是ListHeader时,你看到标题了吗?
    • 使用 ListHeaderTemplate 时无法直接访问 txtHeader。
    • @Ajay 这不是我要问的。您是说当您使用 ListHeader 且未设置 ItemSource 时不显示标题。和 ListHeaderTemplate 一样吗?
    • 是的,它是相同的标题。当我使用 ListHeader 而不是 ListHeaderTemplate 时,我可以直接访问文本块,即 txtHeader 来分配文本。但我必须分配 ItemSource 即 ListModel,然后它显示标题。但是如果我没有分配模型,我就无法显示标题。第二件事是当我使用 ListHeaderTemplate 而不是 ListHeader 时,我无法访问文本块,即 txtHeader。我必须使用 FindFirstElementInVisualTree 来查找 textbolck。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多