6
votes

Comment définir des objetsPaneltemplate sur une grille créée de manière dynamique dans le code derrière

J'ai ce usercontrol code> défini dans xaml code> et souhaite définir le itemspaneltemplate code> de manière dynamique dans mon code derrière la classe (pas dans le XAML CODE> Comme dans l'exemple):

this.Items.ItemsPanel.Template = new Grid();


0 commentaires

5 Réponses :


4
votes

Vous devez créer un itemsPaneltemplate et définir son VisualTree sur un FrameworkElementFactory (obsolète) qui crée la grille ou utilisez le xamlreader à Analyse a xaml-chaîne qui spécifie le modèle.

Cette question contient des exemples d'utilisation des deux méthodes (bien que pour une propriété de modèle différente).

Une méthode plus facile pour manipuler le panneau au moment de l'exécution est décrite dans Ce Question .


5 commentaires

Ok, je dois admettre que je suis un débutant WPF et je ne comprends pas totalement votre réponse (ma faute). J'espérais pouvoir créer la grille ( nouvelle grille ) et définissez simplement le modèle sur la grille créée de manière dynamique (comme conditionné à ma question). Pourriez-vous peut-être montrer un exemple?


@nabulke: Avez-vous consulté la question liée?


Vérification des exemples en ce moment. Merci pour l'ajout. J'espérais qu'il y aurait un moyen plus facile de définir le nombre de lignes / colonnes de grille au moment de l'exécution.


Eh bien, si vous voulez le définir à partir de zéro, c'est la façon de le faire, si vous voulez simplement le modifier (vous pouvez ajouter un grille sans définitions) Cette question ici pourrait être ce que vous recherchez.


La solution postée dans le lien que vous avez fourni fonctionne bien: j'ai ajouté un gestionnaire d'événements chargé qui ajoute les cols / rangées à la grille, définie dans XAML. Merci de votre aide.



5
votes

Vous pouvez faire comme vous le souhaitez en créant MannualCode dans le code derrière comme suit: 1. Créez une méthode comme suivante qui retournera un élément d'éléments

   MyListBox.ItemsPanel = GetItemsPanelTemplate();


0 commentaires

1
votes

Si vous avez encore du travail à faire avec les éléments, vous devez prendre le code suivant (étendu):

Nous avons d'abord besoin d'une aide afin d'obtenir l'élément: P>

// --------------------------------------------------------------------
private void m_SettingTemplate ()
{
  // the online doc recommends to parse the template
  string xaml = 
    @"<ItemsPanelTemplate
          xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
          xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
        <WrapPanel ItemWidth=""150"" MaxWidth=""150""/>
      </ItemsPanelTemplate>";
  // assigning the template
  oMyListView.ItemsPanel = ( System.Windows.Markup.XamlReader.Parse (xaml) as ItemsPanelTemplate );
  // fetching the WrapPanel
  WrapPanel oWrapPanel = m_WrapPanelAusVisualHolen (oMyListView);
  Debug.Assert (oWrapPanel != null);
  if ( oWrapPanel != null )
  { // adjusting the size of the WrapPanel to the ListView
    Binding oBinding = new Binding ("ActualWidth");
    oBinding.Source = oMyListView;
    oWrapPanel.SetBinding (WrapPanel.MaxWidthProperty, oBinding);
  };
}


0 commentaires

0
votes

Voici un programme basé sur XAML qui utilise itemsPaneltemplate code> avec un grille code>:

mainwindow.xaml code>: p>

public static class Extensions
{
    public static T SetDock<T>(this T element, Dock dock) where T : UIElement
    {
        DockPanel.SetDock(element, dock);

        return element;
    }

    public static T SetColumn<T>(this T element, int value) where T : UIElement
    {
        Grid.SetColumn(element, value);

        return element;
    }

    public static T SetValue_<T>(this T factory, DependencyProperty dp, object value) where T : FrameworkElementFactory
    {
        factory.SetValue(dp, value);

        return factory;
    }

    public static T AppendChildren<T>(this T factory, params FrameworkElementFactory[] children) where T : FrameworkElementFactory
    {
        foreach (var child in children)
            factory.AppendChild(child);

        return factory;
    }

    public static T SetVisualTree<T>(this T template, FrameworkElementFactory factory) where T : FrameworkTemplate
    {
        template.VisualTree = factory;

        return template;
    }

    public static T1 SetItemsPanel<T1,T2>(this T1 control, T2 template) where T1 : ItemsControl where T2 : ItemsPanelTemplate
    {
        control.ItemsPanel = template;

        return control;
    }

    public static T AddItems<T>(this T control, params object[] items) where T : ItemsControl
    {
        foreach (var item in items)
            control.Items.Add(item);

        return control;
    }

    public static T AddSelectionChanged<T>(this T obj, RoutedEventHandler handler) where T : TextBoxBase
    {
        obj.SelectionChanged += handler;

        return obj;
    }

    public static T1 AddChildren<T1>(this T1 panel, params UIElement[] elements) where T1 : Panel
    {
        foreach (var elt in elements)
            panel.Children.Add(elt);

        return panel;
    }

}


0 commentaires

0
votes

pour quelqu'un d'autre ...

... un contrôle basé sur l'itemSControl qui a une propriété d'orientation. p>

Il utilise le FrameworcementFactory comme dans les réponses précédentes: P>

public class OrientationItemsControl : ItemsControl
{

    public static readonly DependencyProperty OrientationProperty = WrapPanel.OrientationProperty.AddOwner(typeof(OrientationItemsControl), new PropertyMetadata(Changed));

    private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is ItemsControl itemsControl && e.NewValue is Orientation orientation)
        {
            var factory = new FrameworkElementFactory(typeof(StackPanel));
            factory.SetValue(OrientationProperty, orientation);
            itemsControl.ItemsPanel = TemplateGenerator.CreateItemsPanelTemplate(factory);
        }
    }
    
    public Orientation Orientation
    {
        get => (Orientation)GetValue(OrientationProperty);
        set => SetValue(OrientationProperty, value);
    }
}


0 commentaires