2014-09-07 6 views
1



Я пытаюсь обновить все элементы своего текстового поля после загрузки моей страницы.
VisualElements не показан при первой загрузке страницы

Вопрос

Почему же TextBoxes не возвращается при первой загрузке?

Explaination

У меня есть MainWindow с элементом рамы в нем перемещаться между МОФ страниц.
Итак, когда пользователь нажимает на элемент меню, страница загружается в рамку.
Вот код, когда пользователь Нажмите на MenuItem:

Код для загрузки новой страницы в рамке (метод Navigate)

public static void Navigate(Page page, double fadeTime = 0.6) 
    { 
     MainWindow MainWin = (MainWindow) Application.Current.MainWindow; 
     Frame NavFrame = MainWin.mainFrame; 


     if (NavFrame.Content != page) 
     { 
      NavFrame.NavigationService.Navigate(page); 

      //Gebruik Dispatcher om Fadein Effect te kunnen toepassen 
      Frame mainFrame = NavFrame; 
      NavFrame.Dispatcher.BeginInvoke(
       new Action(() => 
       { 
        //Voeg Animatie Toe 
        NavFrame.Opacity = 0; 
        DoubleAnimation fadeIn = new DoubleAnimation(0, 1, TimeSpan.FromSeconds(fadeTime), FillBehavior.HoldEnd); 
        mainFrame.BeginAnimation(UIElement.OpacityProperty, fadeIn, HandoffBehavior.Compose); 
       }));     

      //Bij navigeren naar andere pagina roep GC aan. 
      GC.Collect(); 
     } 

     int amount = 0; 
     //Apply Color on CaretBrush 
     foreach (TextBox tb in Worker.FindVisualChildren<TextBox>(page)) 
     { 
      amount++; 
      tb.CaretBrush = (Brush)new BrushConverter().ConvertFromString("#FF8E9CFF"); 
     } 

     Worker.ShowModernBox(amount.ToString()); //Custom messagebox 
     page.UpdateDefaultStyle(); 
     page.UpdateLayout(); 
    } 

Метод FindVisualChildren

//Haal alle elementen van huidige view op. 
    public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
    { 
     //Indien het object gevuld is met componenten 
     if (depObj != null) 
     { 
      //Voor ieder Object in huidige view 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 
       //geef Child terug 
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        yield return (T) child; 
       } 

       //geef CHilds van CHild terug. 
       foreach (T childOfChild in FindVisualChildren<T>(child)) 
       { 
        yield return childOfChild; 
       } 
      } 
     } 
    } 

Проблема

Первый раз, когда пользователь загружает эту страницу, он возвращает значение int как 0, когда вы нажимаете второй раз, я получаю все 19 текстовых полей. почему это? Когда я отлаживаю его и я расширяю свою страницу, я могу видеть текстовые поля там

+0

Визуальное дерево просто не была создана, когда страница будет перемещаться в первый раз. Однако почему такой сложный подход? Вместо этого вы можете просто привязать все свойства TextBoxes «CaretBrush» к одному свойству модели представления, или к статическому ресурсу или чему-либо еще, что вы измените при навигации по странице. – Clemens

+1

'Navigate()' является асинхронным, поэтому вы должны зарегистрироваться в 'LoadCompleted'. – Pragmateek

+0

Pragmateek, Спасибо! не работает для LoadCompleted, но это было сделано для ContentRendered на фрейме. –

ответ

0

Благодаря Pragmateek.
Решение: Binding следующий код в событие ContentRendered

foreach (TextBox tb in Worker.FindVisualChildren<TextBox>(page)) 
    { 
     amount++; 
     tb.CaretBrush = (Brush)new BrushConverter().ConvertFromString("#FF8E9CFF"); 
    } 

    Worker.ShowModernBox(amount.ToString()); //Custom messagebox 
    page.UpdateDefaultStyle(); 
    page.UpdateLayout(); 

Reason

содержание просто не отображается, когда VisualTree было найти элементы. Поэтому дождитесь, пока страница сначала отобразит все его содержимое, привязав ее к событию ContentRendered.

кредиты идут на Pragmateek