如何在WPF中动态访问子元素

时间:2014-10-16 01:59:58

标签: c# wpf

在WPF中,我有一个像这样的结构

<Button>
    <Grid>
        <!--definitions for 1 row and 2 columns-->
        <TextBlock x:Name="t1" Grid.Column="0"/>
        <TextBlock x:Name="t2" Grid.Column="1"/>
    </Grid>
</Button>

假设具有此结构的Button b是动态生成的。如何从t1访问Button b

编辑以澄清:由于t1位于Button b内,如果只有t1访问权限,是否可以更改b的内容? b.childGridElement.childTextBlock_t1.Text = "newString"

的某些内容

2 个答案:

答案 0 :(得分:2)

这适用于您提供的用例:

((TextBlock)b.FindName("t1")).Text = "newString";

答案 1 :(得分:2)

您需要使用Visual Tree Helper。

定义处理程序扩展方法

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject parent) where T : DependencyObject
        {
            if (parent != null)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
                {
                    var child = VisualTreeHelper.GetChild(parent, i);

                    // If the available child is not null and is of required Type<T> then return with this child else continue this loop
                    if (child != null && child is T)
                    {
                        yield return (T)child;
                    }

                    foreach (T childOfChild in FindVisualChildren<T>(child))
                    {
                        yield return childOfChild;
                    }
                }
            }
        }

现在你的xaml

IEnumerable<TextBlock> textblockes=FindVisualChildren<TextBlock>(b);

foreach (var textblock in textblockes)
{
  if (textblock!= null && textblock.Name="t1")
  {
    //write code for t1 here;
  }
  if (textblock!= null && textblock.Name="t2")
  {
    //write code for t2 here;
  }                                     

}

在上面的方法中,无论你的树结构如何,它都会找到你按钮b的所有文本块,然后根据Name属性你可以进行适当的操作。