2013-07-14 4 views
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 information: The name already exists in the tree: Tb.

Xaml код thisGrid (GrdLogo):

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

    </Grid> 

Кроме того, без транзистора это работает, но я не знаю, как это может иметь значение, поэтому я прошу помощи. Я все еще довольно свежий в создании динамических элементов управления. В любом случае для меня код выглядит хорошо, но, возможно, я должен использовать какой-то метод async для удаления этого TextBlock?

+0

Должны ли мы предположить, что вы на самом деле устанавливаете «called = true» по мере необходимости? – McGarnagle

+0

Да, нет сомнений. Я тестировал его много раз и без перехода в Grid работает хорошо. Дело в том, как запустить это с помощью перехода без использования глобальных типов int. Я думаю, что это не обязательно. – MajQel

+0

Вы уверены, что 'GrdLogo.FindName (" Tb ")' возвращает ненулевое значение? – ghord

ответ

2

Ошибка возникает из-за того, что экземпляр GrdLogo не знает, что вы удалили элемент с именем Bd из его визуального дерева. Вы должны уведомить его по телефону FrameworkElement.UnregisterName:

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

EDIT

Поскольку вы не можете использовать этот метод в коде W8 (нет доступа NameScope в WinRT), следует избегать использования названных элементов в целом , Удалите название текстового блока в xaml и используйте другие средства для удаления управления:

GrdLogo.Children.Remove(GrdLogo.Children.OfType<TextBlock>().Single()); 
+0

Кажется, что это решение, но мой компилятор не распознает «unregisterName» (VS 2012 для W8), даже если я использую System.Windows в начале (насколько я знаю, это пространство имен, где есть unregistername). Тогда что мне нужно сделать, чтобы использовать этот метод? – MajQel

+0

@MajQel Кажется, этот метод присутствует только в WPF. Я искал документацию WinRT и не нашел способа отменить регистрацию имени из namescope. – ghord

+0

Так что я не могу отменить регистрацию, если im не использует wpf ?? thats bad;/ – MajQel

Смежные вопросы