我有这个功能:
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?
答案 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());