首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用VisualTreeHelper访问控件

无法使用VisualTreeHelper访问控件
EN

Stack Overflow用户
提问于 2014-03-02 07:28:26
回答 1查看 249关注 0票数 0

因此,在我的页面中,我添加了一个Pivot。我将Pivot命名为MainPivot。在MainPivot中,我编辑了Title Template。在TitleTemplate中,我添加了2个TextBlocks。一个叫做AppTitle,另一个叫做UserText

我想要做的是使用C#设置AppTitleUserText的文本。为此,我设法从this link获得了VisualTreeHelper。虽然它是“如何在ListBox中访问”,但我添加了一些更改,以查看它是否有效。

所以我的代码。用于已编辑的MainPivot的XAML

代码语言:javascript
复制
<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的代码

代码语言:javascript
复制
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文本的代码:

代码语言:javascript
复制
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);

有谁能帮帮我吗?我所要做的就是访问这两个文本块并更改文本。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-03-02 07:52:56

为什么要把它当做模板呢?

为什么不直接设置标题呢

代码语言:javascript
复制
<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。

代码语言:javascript
复制
AppTitle.Text = "APPLICATION TITLE";
UserText.Text = "USER TEXT";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22121817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档