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);
}
}