Nascondi la riga della griglia in WPF

Ho un semplice modulo WPF con una Grid dichiarata nel modulo. Questa Grid ha un sacco di righe:

      

La riga chiamata rowToHide contiene alcuni campi di input e voglio hide questa riga dopo aver rilevato che non ho bisogno di questi campi. È abbastanza semplice impostare Visibility = Hidden su tutti gli elementi nella riga, ma la riga occupa ancora spazio nella Grid . Ho provato ad impostare Height = 0 sugli articoli, ma non sembra funzionare.

Puoi pensare in questo modo: hai un modulo, lì hai un menu a discesa che dice “Tipo di pagamento”, e se la persona seleziona “Contanti”, vuoi hide la riga contenente i dettagli della Carta. Non è un’opzione per avviare il modulo con questo già nascosto.

Puoi farlo anche facendo riferimento alla riga nella griglia e quindi modificando l’altezza della riga stessa.

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 

Anche se il collasso degli elementi all’interno della griglia funziona, questo è un po ‘più semplice se nella griglia sono presenti molti elementi che non hanno un elemento di chiusura che può essere compresso. Ciò fornirebbe una buona alternativa.

La riga non ha una proprietà Visibility, così come altri hanno detto, è necessario impostare l’altezza. Un’altra opzione è quella di utilizzare un convertitore, nel caso in cui sia necessaria questa funzionalità in molte viste:

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

E poi nella vista appropriata :

  

La soluzione migliore e pulita per comprimere righe o colonne è utilizzare un DataTrigger nel tuo caso:

            

Per riferimento, Visibility è un enumeration System.Windows.Visibility a tre stati:

  • Visibile: l’elemento viene sottoposto a rendering e partecipa al layout.
  • Compresso: l’elemento è invisibile e non partecipa al layout. Dare in modo efficace altezza e larghezza a 0 e comportarsi come se non esistesse.
  • Nascosto: l’elemento è invisibile ma continua a partecipare al layout.

Vedi questo suggerimento e altri suggerimenti sul thread WPF Tips and Tricks .

Basta fare questo:
rowToHide.Height = new GridLength(0);

se userai visibility.Collapse poi devi impostarlo per ogni membro della riga.

Invece di giocare con Grid Row, è ansible impostare la proprietà Visibility dei Control (campi nella riga) su “Collapsed”. Questo assicurerà che i controlli non occupino spazio e se hai Grid Row Height = “Auto”, la riga verrà nascosta poiché tutti i controlli nella riga hanno Visibility = “Collapsed”.

       

Questo metodo è migliore perché la visibilità dei controlli può essere associata a qualche proprietà con l’aiuto di un convertitore.

Imposta la visibilità del contenuto della riga su Visibility.Collapsed invece di Hidden. Questo renderà il contenuto smettere di occupare spazio, e la riga si ridurrà in modo appropriato.

Ho avuto un’idea simile ereditando RowDefinition (solo per interesse)

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

Ora puoi usarlo come segue:

        

e passare con

 RowToHide.IsHidden = !RowToHide.IsHidden;