1

Considérons la partie suivante d'un arbre visuel dans une application Windows Phone SL: Comme vous pouvez le voirdéfinir les propriétés d'un auto-généré ContentPresenter

Content presenter

, un modèle de PanoramaItem contient une référence à une statique DataTemplateSelector. Il s'agit d'une classe simple qui alimente dynamiquement le modèle de données en fonction d'une clé fournie, afin d'afficher différentes vues pour différents modèles de vue fournis comme DataContext à PanoramaItem. Voici le code correspondant:

public static T FindResource<T>(this DependencyObject initial, string key) where T : DependencyObject 
     { 
      DependencyObject current = initial; 

      while (current != null) 
      { 
       if (current is FrameworkElement) 
       { 
        if ((current as FrameworkElement).Resources.Contains(key)) 
        { 
         return (T)(current as FrameworkElement).Resources[key]; 
        } 
       } 

       current = VisualTreeHelper.GetParent(current); 
      } 

      if (Application.Current.Resources.Contains(key)) 
      { 
       return (T)Application.Current.Resources[key]; 
      } 

      return default(T); 
     } 
    } 

    public class DataTemplateSelector : ContentControl 
    { 
     protected override void OnContentChanged(object oldContent, object newContent) 
     { 
      ContentTemplate = this.FindResource<DataTemplate>(newContent.GetType().FullName); 
     } 
    } 

Le problème est que je ne contrôle pas la création de ContentPresenter vous pouvez voir sélectionné sur une image ci-dessus. Pour obtenir une mise en page cohérente, je dois pouvoir définir sa propriété Vertical Alignment. Je ne sais pas comment je peux le faire, puisque je ne peux pas faire référence à ce ContentPresenter. Comment puis-je définir les propriétés d'un ContentPresenter?

Répondre

0

La solution était encore une fois simple:

définir un style pour ma ContentControl classe dérivée:

<Style TargetType="support:DataTemplateSelector"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="support:DataTemplateSelector"> 
         <ContentPresenter 
         ContentTemplate="{TemplateBinding support:DataTemplateSelector.ContentTemplate}" 
         Content="{TemplateBinding support:DataTemplateSelector.Content}" 
         VerticalAlignment="Top"/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

J'ai défini le mien dans UserControl.Resources section de XAML d'une vue.

L'appel du « restyling » ligne de code dans le constructeur de la classe:

public class DataTemplateSelector : ContentControl 
    { 
     public DataTemplateSelector() 
     { 
      this.DefaultStyleKey = typeof (DataTemplateSelector); 
     } 

Et voilà comment vous pouvez contrôler le regard de l'élément ContentPresenter d'un contrôle « s dérivés ContentControl.

0

Vous semblez déjà avoir la réponse devant vous.

Utilisez le VisualTreeHelper.GetParent pour obtenir le parent visuel direct du DataTemplateSelector en tant que FrameworkElement, puis modifiez sa propriété VerticalAlignment.

BTW: -

  if (current is FrameworkElement) 
      { 
       if ((current as FrameworkElement).Resources.Contains(key)) 
       { 
        return (T)(current as FrameworkElement).Resources[key]; 
       } 
      } 

peut être réduite à: -

  var currentFE = current As FrameworkElement; 
      if (currentFE != null && currentFE.Contains(key)) 
      { 
       return (T)currentFE.Resource[key]; 
      } 

Cast tentative se produit une seule fois au lieu de potentiellement trois fois, est plus courte et est plus facile à comprendre. Un exemple où ajoutant une variable est bénéfique (alors que normalement nous pourrions essayer de réduire le nombre de variables dans notre code).

+0

Merci pour le conseil. Bien que je doive définir la valeur d'un ContentPresenter qui est rendu exactement au-dessous du DataTemplateSelector (DTS pour faire court), pas son parent. Target ContentPresenter est un élément par défaut pour toutes les classes dérivées de ContentControl (DTS dérive de ContentControl), et je suppose, peut être modifié en redéfinissant le ControlTemplate par défaut de DataTemplateSelector. Je trouve un exemple de la façon de le faire en XAML, mais DTS est un contrôle de code seulement, et je ne sais pas comment contourner dans cette situation. –

Questions connexes