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
, 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?
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. –