2017-06-23 1 views
0

J'ai plusieurs cas où un utilisateur peut avoir besoin d'entrer des données supplémentaires en fonction d'une sélection de zone de liste déroulante. Le nombre de zones de texte nécessaires change en fonction de la sélection (min 1- max 3). Afin de garder ces éléments organisés, je les ai dans GroupBox (s). Ce dont j'ai besoin, c'est de conseils pour atteindre cet effet. Dois-je ajouter par programme des lignes à une grille dans la zone de groupe? Dois-je créer toutes les zones de texte et toutes les étiquettes et modifier la propriété de visibilité lors de la sélection d'un événement modifié? Je n'aime pas vraiment la deuxième idée parce que la boîte de groupe sera mise à l'échelle de façon inappropriée si un seul champ de texte est requis. Je me rends compte du contexte général de ma question, en tant que novice avec WPF, j'ai juste besoin de conseils sur les meilleures pratiques pour y parvenir.Jeux de contrôles dynamiques sur la sélection de zone de liste déroulante

Mise à jour J'ai essayé de réduire la ligne sur le changement de sélection. Cela supprime le contenu mais laisse toujours ma boîte de groupe de la même taille.

<GroupBox Name="gbCondensor" Height="Auto" Header="Condensor" 
FontSize="16" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" 
Margin="20,0,20,92" Grid.RowSpan="2"> 
     <Grid Name="grdCondensor" Margin="0,10,0,0" Height="auto"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <Label x:Name="lblCondensorTemp" Grid.Column="0" Grid.Row="0" 
Content="Condensor Temperature" HorizontalAlignment="Center" 
VerticalAlignment="Center" Height="32" Width="255"/> 
      <ComboBox Name="cmbCondensorTemp" FontSize= "16" Width="200" 
Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" 
HorizontalAlignment="Left" Margin="10,0" Height="30"> 
       <ComboBoxItem IsSelected="True">Constant</ComboBoxItem> 
       <ComboBoxItem>Linear</ComboBoxItem> 
       <ComboBoxItem>Switching</ComboBoxItem> 
      </ComboBox> 
      <Label Name="lblCondensorTempText" Content="Temperature" 
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0" 
Grid.Row="2" ></Label> 
      <TextBox Name="txtCondensorTemp" Grid.Column="1" Grid.Row="2" 
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center" 
Width="73"></TextBox> 
      <Label Name="lblEndCondTemp" Content="Temperature" 
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0" 
Grid.Row="3" ></Label> 
      <TextBox Name="txtEndCondTemp" Grid.Column="1" Grid.Row="3" 
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center" 
Width="73"></TextBox> 
      <Label Name="lblSwitchCondTemp" Content="Temperature" 
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0" 
Grid.Row="4" ></Label> 
      <TextBox Name="txtSwitchCondTemp" Grid.Column="1" Grid.Row="4" 
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center" 
Width="73"></TextBox>     
</GroupBox> 

Avec ce pour replier les lignes dans le code:

 void CheckCondensorComboBox(object sender, SelectionChangedEventArgs e) 
    { 

     if (cmbCondensorTemp.SelectedIndex == 0) 
     { 
      lblEndCondTemp.Visibility = Visibility.Collapsed; 
      txtEndCondTemp.Visibility = Visibility.Collapsed; 
      grdCondensor.RowDefinitions[3].Height = new GridLength(0); 
      lblSwitchCondTemp.Visibility = Visibility.Collapsed; 
      txtSwitchCondTemp.Visibility = Visibility.Collapsed; 
      grdCondensor.RowDefinitions[4].Height = new GridLength(0); 
     } 
     else if (cmbCondensorTemp.SelectedIndex == 1) 
     { 

      lblEndCondTemp.Visibility = Visibility.Visible; 
      txtEndCondTemp.Visibility = Visibility.Visible; 
      grdCondensor.RowDefinitions[3].Height = new GridLength(30); 
      lblSwitchCondTemp.Visibility = Visibility.Collapsed; 
      txtSwitchCondTemp.Visibility = Visibility.Collapsed; 
      grdCondensor.RowDefinitions[4].Height = new GridLength(0); 
     } 
     else if (cmbCondensorTemp.SelectedIndex == 2) 
     { 
      lblEndCondTemp.Visibility = Visibility.Visible; 
      txtEndCondTemp.Visibility = Visibility.Visible; 
      grdCondensor.RowDefinitions[3].Height = new GridLength(30); 
      lblSwitchCondTemp.Visibility = Visibility.Visible; 
      txtSwitchCondTemp.Visibility = Visibility.Visible; 
      grdCondensor.RowDefinitions[4].Height = new GridLength(30); 
     } 

    } 

Ce que je vais faire ici est une zone de groupe qui change sa hauteur sur la base des contrôles nécessaires par sélection de l'utilisateur.

+0

En ce qui concerne votre deuxième point, vous ne devriez pas avoir de problèmes avec la taille de la zone de groupe si la visibilité est réduite ou masquée. – MoonBoots89

Répondre

0

Vos deux idées sont valides. La question est un peu difficile à répondre spécifiquement sans voir le code, mais d'une manière générale j'aime commencer par penser à la maintenabilité d'abord - le code est généralement lu beaucoup plus de fois qu'il est écrit.

Je suppose que la simple réduction des champs supplémentaires inutiles peut être plus simple et plus facile à gérer que la création de champs supplémentaires et leur liaison lors de l'exécution. Essayez un sens et voyez à quoi il ressemble - ne passez pas trop de temps à peser le tout.

+0

J'ai essayé de réduire la ligne sur le changement de sélection. Cela supprime le contenu mais laisse toujours ma boîte de groupe de la même taille. – willkk

+0

J'ai ajouté du code de test à poster. Cela fonctionne pour masquer le contenu mais ne pas redimensionner la zone de groupe. – willkk

+0

@willkk - vérifie que les lignes de la grille qui contiennent le GroupBox ne sont pas définies à une hauteur fixe. – MoonBoots89