1

我有这个功能:

void Title(string t)
    {
        if (called == true)
        {
            GrdLogo.Children.Remove((TextBlock)GrdLogo.FindName("Tb"));

        }

            TextBlock Tb = new TextBlock();
            Tb.Text = t;
            Tb.Name = "Tb";


            Tb.Height = 160;
            Tb.FontSize = 70;
            Tb.Margin = new Thickness(Img.Width * 2 + 30, 30, 0, 0);
            GrdLogo.Children.Add(Tb);

    }

调用此函数后,我收到错误:

WinRT 信息:名称已存在于树中:Tb。

thisGrid (GrdLogo) 的 Xaml 代码:

<Grid x:Name="GrdLogo" HorizontalAlignment="Left" Height="160" VerticalAlignment="Top" Width="1366" Background="#FF1D1D1D">
        <Grid.ChildrenTransitions>
            <TransitionCollection>
                <AddDeleteThemeTransition />
            </TransitionCollection>
        </Grid.ChildrenTransitions>

    </Grid>

此外,如果没有过渡,它可以工作,但我不知道它如何产生任何影响,所以我正在寻求帮助。我在创建动态控件方面仍然很新鲜。无论如何对我来说代码看起来不错,但也许我应该使用某种异步方法来删除这个 TextBlock?

4

1 回答 1

2

出现错误是因为GrdLogo实例不知道您从其Bd可视树中删除了命名的元素。您需要通过调用通知它FrameworkElement.UnregisterName

if (called == true)
{
    GrdLogo.Children.Remove((TextBlock)GrdLogo.FindName("Tb"));
    GrdLogo.UnregisterName("Tb");
}

编辑

由于您不能在 W8 代码中使用该方法(WinRT 中没有名称范围访问),因此您应该完全避免使用命名元素。在 xaml 中删除您的文本块名称并使用其他删除控制的方法,例如:

GrdLogo.Children.Remove(GrdLogo.Children.OfType<TextBlock>().Single());
于 2013-07-14T21:59:03.107 回答