Si je nomme chaque ligne et colonne dans une grille, puis-je définir un contrôle grid.row = "Row_Top"? J'ai défini StaticResources pour y faire référence mais existe-t-il un convertisseur ou une autre méthode pour accomplir cela sans la ressource?XAML: Puis-je faire référence à une ligne ou une colonne de grille par son nom?
2
A
Répondre
6
Pour autant que je sais qu'il n'y a aucun moyen intégré pour le faire ... Cependant, vous pouvez utiliser des extensions de balisage pour récupérer une ligne ou une colonne par son nom:
[MarkupExtensionReturnType(typeof(int))]
public abstract class GridBandExtensionBase : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (serviceProvider != null)
{
var target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (target != null)
{
var obj = target.TargetObject as DependencyObject;
if (obj != null)
{
var grid = VisualTreeHelper.GetParent(obj) as Grid;
if (grid != null)
{
return GetBandIndex(grid);
}
}
}
}
return 0;
}
protected abstract int GetBandIndex(Grid grid);
}
public class GridRowExtension : GridBandExtensionBase
{
public GridRowExtension() {}
public GridRowExtension(string rowName)
{
this.RowName = rowName;
}
[ConstructorArgument("rowName")]
public string RowName { get; set; }
protected override int GetBandIndex(System.Windows.Controls.Grid grid)
{
for (int i = 0; i < grid.RowDefinitions.Count; i++)
{
if (grid.RowDefinitions[i].Name == RowName)
{
return i;
}
}
return 0;
}
}
public class GridColumnExtension : GridBandExtensionBase
{
public GridColumnExtension() {}
public GridColumnExtension(string columnName)
{
this.ColumnName = columnName;
}
[ConstructorArgument("columnName")]
public string ColumnName { get; set; }
protected override int GetBandIndex(System.Windows.Controls.Grid grid)
{
for (int i = 0; i < grid.ColumnDefinitions.Count; i++)
{
if (grid.ColumnDefinitions[i].Name == ColumnName)
{
return i;
}
}
return 0;
}
}
Vous pouvez ensuite utiliser ces extensions comme suit:
<Button Grid.Row="{my:GridRow Row_Top}"
Grid.Column="{my:GridColumn Column_Right}"
Content="Hello world" />
REMARQUE: si vous compilez ces extensions de balisage dans le même ensemble que votre application, le concepteur ne sera pas en mesure d'appeler le constructeur avec un paramètre (mais il fonctionne très bien à runtime). C'est un known bug que Microsoft n'a pas l'intention de réparer. Si vous voulez que cela fonctionne au moment du design, placez l'extension de balisage dans un assemblage séparé, ou spécifiez les propriétés RowName/ColumnName explicitement, comme suit:
<Button Grid.Row="{my:GridRow RowName=Row_Top}"
Grid.Column="{my:GridColumn ColumnName=Column_Right}"
Content="Hello world" />
Questions connexes
- 1. Existe-t-il un moyen de référencer une colonne de grille par le nom x: Name comme une alternative à son index de base zéro?
- 2. Ajouter dynamiquement une colonne de la grille dans xaml
- 3. SQL Server recherche une colonne par son nom
- 4. Obtenir une référence C à une fonction python intégrée par son nom?
- 5. Comment insérer une ligne/colonne dans une grille WPF?
- 6. comment donner une ligne à une ligne de la grille
- 7. Référence d'une cellule par son nom dans Excel.Application dans ASP
- 8. Comment obtenir une référence à un objet Lift MetaMapper par son nom?
- 9. En Python, comment faire référence à un identifiant par son nom complet absolu?
- 10. Application d'une couleur d'arrière-plan à une ligne de grille entière dans XAML Silverlight
- 11. Comment puis-je faire référence à un contrôle dans son événement? (sans utiliser son nom)
- 12. Howto faire référence à ints par nom en Python
- 13. Ajouter dynamiquement une ligne à une grille à l'exécution
- 14. Comment obtenir une référence à un contrôle à partir de son nom de chaîne en C#
- 15. Choisir une colonne avec une valeur par défaut ou une colonne avec une valeur définie par l'utilisateur sinon null?
- 16. Référence à un objet contenu dans une position de grille
- 17. Comment ajouter une colonne personnalisée à une grille MvcContrib?
- 18. Obtenir une définition de la colonne par son nom dans WPF
- 19. Puis-je mettre une contrainte sur une colonne sans faire référence à une autre table?
- 20. faire une colonne dans sybase par défaut à la date/heure actuelle d'insertion de ligne
- 21. comment faire pour par une colonne to_char
- 22. multi-colonnes ou une colonne par index?
- 23. Set Window.Content à une page par XAML?
- 24. dojox.grid.DataGrid sélectionner une ligne par la valeur d'une colonne
- 25. En pur XAML, est-il possible d'aligner une ligne sur une partie d'une grille?
- 26. Créer une instance de classe objective-c par son nom?
- 27. Appliquer sélectivement css à une ligne dans une grille
- 28. Obtention d'un élément de document de référence par son nom à l'aide de javascript
- 29. ActionScript - comment traiter une instance par son nom?
- 30. Récupère une ligne filtrée dans une grille
Merci Thomas, réponse exceptionnelle! – Brad