2016-06-23 7 views
1

Nous avons une application de téléphone Windows, où nous avons DataTemplate dans Page.Resource. Ci-dessous le XAML:Comment trouver un contrôle enfant Dans la ressource de page?

<PhoneApplicationPage 
<PhoneApplicationPage.Resources> 
<DataTemplate> 
<ScrollViewer> // We want to fetch this control inside DataTemplate 
.. 
</ScrollViewer> 
</DataTemplate> 
</PhoneApplicationPage.Resources> 

<Grid Name="LayoutRoot"> 
<ItemsControl ItemTemplate={StatisSource DataTemplate}> 
</ItemsControl> 
</Grid> 

</PhoneApplicationPage 

Jusqu'à présent, nous avons utilisé aide de Visual Tree et itérer pour trouver le contrôle des enfants à l'intérieur. Ci-dessous l'extrait d'aide que nous utilisons:

public T FindChild<T>(DependencyObject parent, string childName) 
where T : DependencyObject 
    { 
     // Confirm parent and childName are valid. 
     if (parent == null) return null; 

     T foundChild = null; 

     int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < childrenCount; i++) 
     { 
      var child = VisualTreeHelper.GetChild(parent, i); 
      // If the child is not of the request child type child 
      T childType = child as T; 
      if (childType == null) 
      { 
       // recursively drill down the tree 
       foundChild = FindChild<T>(child, childName); 

       // If the child is found, break so we do not overwrite the found child. 
       if (foundChild != null) break; 
      } 
      else if (!string.IsNullOrEmpty(childName)) 
      { 
       var frameworkElement = child as FrameworkElement; 
       // If the child's name is set for search 
       if (frameworkElement != null && frameworkElement.Name == childName) 
       { 
        // if the child's name is of the request name 
        foundChild = (T)child; 
        break; 
       } 
      } 
      else 
      { 
       // child element found. 
       foundChild = (T)child; 
       break; 
      } 
     } 

     return foundChild; 
    } 

et l'appel ci-dessus fonction:

   ScrollViewer scrollViewer = FindChild<ScrollViewer>((this.View.FindName("AdSlider") as ItemsControl) ,"scrollViewer") as ScrollViewer; 

Mais objet ScrollViewer ont toujours une valeur nulle. Nous sommes incapables d'extraire le contrôle attendu dans le datatemplate. Toute suggestion ?

Merci.

Répondre

0

1 Ne fournit pas un nom de commande à votre fonction

Change:

ScrollViewer scrollViewer = FindChild<ScrollViewer>((this.View.FindName("AdSlider") as ItemsControl) ,"scrollViewer") as ScrollViewer; 

Je ne vois aucun contrôle nommé AdSlider dans votre échantillon.

en:

ScrollViewer scrollViewer = FindChild<ScrollViewer>((this.View.FindName("AdSlider") as ItemsControl) , null); 

2 fournissent un nom à votre DataTemplate

Change:

<DataTemplate> 

en:

<DataTemplate x:Key="dataTemplate1"> 

3 S'il vous plaît aussi correct

<ItemsControl ItemTemplate={StatisSource dataTemplate1}> 

dans:

<ItemsControl ItemTemplate={StaticSource dataTemplate1}> 
+0

Merci pour vos commentaires Durin. Mais après avoir fait tout ce que vous avez suggéré, la méthode FindChild renvoie une exception "référence n'est pas un objet de dépendance visuel valide", car il n'acceptera pas de paramètre comme DataTemplate. Nous avons donc essayé une autre méthode comme: ((this.View.FindName ("AdvertSlider") comme SlideViewExtended) .ItemTemplate.LoadContent() comme ScrollViewer). Mais cette méthode crée une même copie des éléments de l'interface utilisateur et ne nous aide pas à manipuler le comportement de défilement de ScrollViewer. – prdp89

+0

J'ai corrigé quelques erreurs qui me semblaient évidentes. Mais après avoir regardé en arrière, je ne suis pas sûr de comprendre ce que vous cherchez. J'ai également corrigé point2 où le code n'était pas visible –

+0

Nous essayons de trouver scrollviewer à l'intérieur du datatemplate de Itemscontrol et notre tâche est de faire défiler ce scrollviewer après. – prdp89