Masquer la ligne de grid dans WPF

J’ai un simple formulaire WPF avec une Grid déclarée sur le formulaire. Cette Grid contient un tas de lignes:

      

La ligne nommée rowToHide contient quelques champs d’entrée et je veux cacher cette ligne après avoir détecté que je n’ai pas besoin de ces champs. Il est assez simple de définir Visibility = Hidden pour tous les éléments de la ligne, mais la ligne occupe toujours de la place dans la Grid . J’ai essayé de régler Height = 0 sur les éléments, mais cela ne semblait pas fonctionner.

Vous pouvez y penser comme ceci: Vous avez un formulaire, vous avez un menu déroulant indiquant “Type de paiement”, et si la personne sélectionne “Espèces”, vous souhaitez masquer la ligne contenant les détails de la Carte. Ce n’est pas une option pour démarrer le formulaire avec ce déjà caché.

Vous pouvez également le faire en référençant la ligne dans la grid, puis en modifiant la hauteur de la ligne elle-même.

XAML

         

VB.NET

 If LinksList.Items.Count > 0 Then Links.RowDefinitions(2).Height = New GridLength(1, GridUnitType.Star) Else Links.RowDefinitions(2).Height = New GridLength(0) End If 

Bien que le regroupement des éléments dans la grid fonctionne également, c’est un peu plus simple si vous avez de nombreux éléments dans la grid qui ne comportent pas d’élément englobant pouvant être réduit. Cela fournirait une bonne alternative.

Row n’a pas de propriété Visibility, donc, comme d’autres l’ont dit, vous devez définir la hauteur. Une autre option consiste à utiliser un convertisseur, au cas où vous auriez besoin de cette fonctionnalité dans de nombreuses vues:

  [ValueConversion(typeof(bool), typeof(GridLength))] public class BoolToGridRowHeightConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return ((bool)value == true) ? new GridLength(1, GridUnitType.Star) : new GridLength(0); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { // Don't need any convert back return null; } } 

Et puis dans la vue appropriée :

  

La meilleure solution pour réduire les lignes ou les colonnes consiste à utiliser un DataTrigger, donc dans votre cas:

             

Pour référence, la Visibility est une énumération System.Windows.Visibility à trois états:

  • Visible – L’élément est rendu et participe à la présentation.
  • Collapsed – L’élément est invisible et ne participe pas à la mise en page. En lui donnant effectivement une hauteur et une largeur de 0 et en se comportant comme si elle n’existait pas.
  • Hidden – L’élément est invisible mais continue de participer à la mise en page.

Voir cette astuce et d’autres conseils sur le fil Conseils et astuces WPF .

Faites simplement ceci:
rowToHide.Height = new GridLength(0);

Si vous utilisez visibility.Collapse alors vous devez le définir pour chaque membre de la ligne.

Au lieu de modifier la ligne de la grid, vous pouvez définir la propriété Visibility des contrôles (champs de la ligne) sur “Réduite”. Cela garantira que les contrôles ne prennent aucun espace et si vous avez Grid Row Height = “Auto”, la ligne sera masquée car tous les contrôles de la ligne ont Visibility = “Collapsed”.

       

Cette méthode est préférable car la visibilité des contrôles peut être liée à une propriété à l’aide d’un convertisseur.

Définissez la visibilité du contenu de la ligne sur Visibility.Collapsed au lieu de Caché. Cela empêchera le contenu de prendre de la place et la ligne se réduira de manière appropriée.

J’ai eu une idée similaire en héritant de RowDefinition (juste pour l’intérêt)

 public class MyRowDefinition : RowDefinition { private GridLength _height; public bool IsHidden { get { return (bool)GetValue(IsHiddenProperty); } set { SetValue(IsHiddenProperty, value); } } // Using a DependencyProperty as the backing store for IsHidden. This enables animation, styling, binding, etc... public static readonly DependencyProperty IsHiddenProperty = DependencyProperty.Register("IsHidden", typeof(bool), typeof(MyRowDefinition), new PropertyMetadata(false, Changed)); public static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) { var o = d as MyRowDefinition; o.Toggle((bool)e.NewValue); } public void Toggle(bool isHidden) { if (isHidden) { _height = this.Height; this.Height = new GridLength(0, GridUnitType.Star); } else this.Height = _height; } } 

Maintenant, vous pouvez l’utiliser comme suit:

        

et basculer avec

 RowToHide.IsHidden = !RowToHide.IsHidden;