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();
5 Réponses :
Vous devez créer un Cette question contient des exemples d'utilisation des deux méthodes (bien que pour une propriété de modèle différente). P>
Une méthode plus facile pour manipuler le panneau au moment de l'exécution est décrite dans Ce Question . P> itemsPaneltemplate Code> et définir son
VisualTree code> sur un
FrameworkElementFactory code>
(obsolète) qui crée la grille code> ou utilisez le
xamlreader code>
à
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 code>) 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 code> 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.
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();
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); }; }
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;
}
}
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); } }