以编程方式遍历xaml文档

时间:2014-06-03 01:18:28

标签: c# windows-phone-8 winrt-xaml

我有以下xaml:

<phone:PivotItem Header="MESSAGES" x:Name="Messages">
    ...
    <ListBox x:Name="MessagesStreamList">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid x:Name="ParticipantImages">
                </Grid>

如何以编程方式遍历以获取ParticipantImages,以便我可以通过编程方式添加列等?

我无法直接访问ParticipantImages

--------- EDIT -----------

我刚尝试使用VisualTreeHelper:

int poop = VisualTreeHelper.GetChildrenCount(MessagesStreamList);

但这会返回 0 的计数。

这是否与ItemTemplate有关?

2 个答案:

答案 0 :(得分:1)

因为它位于DataTemplate中,所以无法从ListBox(或包含列表框的窗口)中按名称获取它。

您可以做的是用用户控件替换数据模板内的Grid,将网格放入该用户控件,然后使用该用户控件内的代码进入Grid。

用户控件定义为:

<UserControl x:Class="WpfApplication1.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         Loaded="UserControl_Loaded_1">
<Grid x:Name="ParticipantImages">

</Grid>
</UserControl>

然后在代码中你可以做到:

    /// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    private void UserControl_Loaded_1(object sender, RoutedEventArgs e)
    {
        ParticipantImages.Visibility = System.Windows.Visibility.Hidden;
    }
}

答案 1 :(得分:0)

我意识到这是一个延迟的反应,但今天我在寻找类似的东西时遇到了这个。

我的目标是修改DataTemplate列表框中的某些项的属性。 这是我的结构:

<ListBox ItemsSource="{Binding}" SelectionChanged="Items_SelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>

在选择更改时,我想修改已更改项目的某些属性。我不认为这是最有效的方式,但它是我得到的。

private void List_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DependencyObject obj = (DependencyObject)sender;

        obj = loopUntilDesiredTypeIsFound<ListBoxItem>(obj);

        for (int i=0; i<VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            ListBoxItem item = (ListBoxItem)VisualTreeHelper.GetChild(obj,i);
            if (item.IsSelected)
            {
                DependencyObject container = loopUntilDesiredTypeIsFound<Grid>(item);
//here we will have the Grid container for the display objects, such as textblocks, checkboxes, etc..
                break;
            }

        }
    }

    private DependencyObject getChild(DependencyObject obj)
    {
        if (VisualTreeHelper.GetChildrenCount(obj) > 0 )
        {
            return VisualTreeHelper.GetChild(obj, 0);
        }
        return null;
    }

    private DependencyObject loopUntilDesiredTypeIsFound<T>(DependencyObject obj)
    {
        while (obj != null)
        {
            int children = VisualTreeHelper.GetChildrenCount(obj);
            if (getChild(obj) is T)
            {
                return obj;
            }
            obj = getChild(obj);
        }
        return null;
    }