无法使用VisualTreeHelper访问控件

时间:2014-03-01 23:28:26

标签: c# xaml windows-phone-7 windows-phone-8 datatemplate

所以,在我的页面中我添加了一个Pivot。我将Pivot命名为MainPivot。在MainPivot内,我编辑了Title Template。在TitleTemplate中,我添加了2个TextBlocks。一个称为AppTitle,另一个称为UserText

我想要做的是使用AppTitle设置UserTextC#的文本。为此,我设法从this link获取了VisualTreeHelper。虽然它的“如何访问ListBox内部”我添加了一些更改,看看它是否有效。

所以我的代码。 已编辑的MainPivot

的XAML
<DataTemplate x:Key="MainPivotEditedTemplate">
 <StackPanel x:Name="Stak" Orientation="Vertical" Width="0">
    <TextBlock x:Name="AppTitle" HorizontalAlignment="Left" TextWrapping="NoWrap" Width="443" Margin="0,0,-443,0" FontSize="22"/>
    <TextBlock x:Name="UserText" HorizontalAlignment="Left" TextWrapping="NoWrap" Width="443" Margin="0,0,-443,0" FontFamily="Segoe WP SemiLight" FontSize="23"/>
 </StackPanel>
</DataTemplate>

以下是VisualTreeHelper的代码:

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

以下是用于更改TextBlock文本的代码:

public MainMenu()
{
  InitializeComponent();

  Pivot apptitle = this.MainPivot.ItemContainerGenerator.ContainerFromIndex(0) as Pivot;
  Pivot usertext = this.MainPivot.ItemContainerGenerator.ContainerFromIndex(1) as Pivot;

  TextBlock _apptitle = FindFirstElementInVisualTree<TextBlock>(apptitle);
  TextBlock _usertext = FindFirstElementInVisualTree<TextBlock>(usertext);     

  _apptitle.Text = "APPLICATION TITLE";
  _usertext.Text = "USER TEXT";      
}

现在我的问题是,当我调试应用程序时,它给出了一个错误说: Reference is not a valid visual DependencyObject.

并在VisualTreeHelper方法中显示此行: var count = VisualTreeHelper.GetChildrenCount(parentElement);

任何人都可以帮助我吗?我想要做的就是访问这两个文本块并更改文本。谢谢!

1 个答案:

答案 0 :(得分:1)

为什么它真的是模板?

为什么不设置标题

<phone:Pivot.Title>
    <StackPanel Name="Stak" Orientation="Vertical" Width="0">
        <TextBlock Name="AppTitle" HorizontalAlignment="Left" TextWrapping="NoWrap" Width="443" Margin="0,0,-443,0" FontSize="22"/>
        <TextBlock Name="UserText" HorizontalAlignment="Left" TextWrapping="NoWrap" Width="443" Margin="0,0,-443,0" FontFamily="Segoe WP SemiLight" FontSize="23"/>
    </StackPanel>
</phone:Pivot.Title>

并直接在

后面的代码中访问TextBlocks
AppTitle.Text = "APPLICATION TITLE";
UserText.Text = "USER TEXT";