使用动画添加动态控件

时间:2013-07-14 21:00:32

标签: c# windows-8 microsoft-metro

我有这个功能:

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的Xaml代码(GrdLogo):

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

    </Grid>

此外,没有过渡它可以工作,但我不知道它是如何有所作为所以我要求帮助。我在创建动态控件方面还很新鲜。无论如何我的代码看起来不错,但也许我应该使用某种异步方法来删除这个TextBlock?

1 个答案:

答案 0 :(得分: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());