2009-08-10 5 views
16

Je suis en train de faire une application qui montre l'utilisation du disque dur dans le système. Pour cela, je veux générer la grille et les contrôles (comme la barre de progression et les étiquettes) dynamiquement pour montrer l'utilisation. Existe-t-il un modèle XAML disponible à cette fin?Ajout dynamique de grille et de contrôles dans WPF

Répondre

16

I en utilisant ce code folowing pour générer dynamiquement des contrôles dans mon code

Label[] drivesLabel; 
Label[] percentageLabel; 
ProgressBar[] drivesProgress; 
int drivesCount = 0; 

private void DrawControls() 
{ 
    try 
    { 
     // Getting drive list. 
     List<DriveInfo> driveList = GetHardDiskDrives(); 
     drivesCount = driveList.Count; 

     // Initializing new Grid. 
     Grid drivesGrid = new Grid(); 
     drivesGrid.Children.Clear(); 
     DrivesBorder.Child = drivesGrid; 

     // Adding Rows and Colums to Grid. 
     RowDefinition[] rows = new RowDefinition[2*drivesCount + 1]; 
     ColumnDefinition[] columns = new ColumnDefinition[6]; 

     // Draw Rows. 
     for (int i = 0; i < 2*drivesCount + 1; i++) 
     { 
      rows[i] = new RowDefinition(); 
      drivesGrid.RowDefinitions.Add(rows[i]); 

      // Setting Row height. 
      rows[i].Height = (0 == i % 2) ? new GridLength(5): new GridLength(25); 
     } 
     // Draw Columns. 
     for (int i = 0; i < 6; i++) 
     { 
      columns[i] = new ColumnDefinition(); 
      drivesGrid.ColumnDefinitions.Add(columns[i]); 
      if (i % 2 == 0) 
      { 
       // Setting column width. 
       columns[i].Width = new GridLength(5); 
      } 
     } 

     // Setting column width. 
     columns[1].Width = new GridLength(60); 
     columns[3].Width = new GridLength(180); 
     columns[5].Width = new GridLength(60); 

     // Draw Labels to show drive letters. 
     drivesLabel = new Label[drivesCount]; 

     // Draw Progress bar to show drive usage. 
     drivesProgress = new ProgressBar[drivesCount]; 

     // Draw Labels to show drive usage. 
     percentageLabel = new Label[drivesCount]; 

     // Adding Labels and Progressbars to Grid. 
     for (int i = 0, j = 1; i < drivesCount; i++, j++) 
     { 
      // Initialize Labels to show drives. 
      drivesLabel[i] = new Label(); 
      drivesLabel[i].Content = driveList[i].Name; 
      drivesLabel[i].Foreground = Brushes.Navy; 
      Grid.SetRow(drivesLabel[i], i + j); 
      Grid.SetColumn(drivesLabel[i], 1); 
      drivesGrid.Children.Add(drivesLabel[i]); 

      // Initialize ProgressBar to show usage. 
      drivesProgress[i] = new ProgressBar(); 
      drivesProgress[i].FlowDirection = FlowDirection.LeftToRight; 
      drivesProgress[i].HorizontalAlignment = HorizontalAlignment.Center; 
      drivesProgress[i].VerticalAlignment = VerticalAlignment.Center; 
      drivesProgress[i].Orientation= Orientation.Horizontal; 
      drivesProgress[i].Value = 0; 
      drivesProgress[i].Maximum = 100; 
      drivesProgress[i].Width = 180; 
      drivesProgress[i].Height = 18; 
      Grid.SetRow(drivesProgress[i], i + j); 
      Grid.SetColumn(drivesProgress[i], 3); 
      drivesGrid.Children.Add(drivesProgress[i]); 

      // Initialize Labels to show usage in percentage. 
      percentageLabel[i] = new Label(); 
      percentageLabel[i].Content = "0 %"; 
      Grid.SetRow(percentageLabel[i], i + j); 
      Grid.SetColumn(percentageLabel[i], 5); 
      drivesGrid.Children.Add(percentageLabel[i]); 

      // Setting window height. 
      SetWindowHeight(30); 
     } 
    } 
    catch(Exception Ex) {} 
} 

Les fonctions GetHardDiskDrives() et SetWindowHeight() sont des fonctions définies par l'utilisateur. Le jpb est d'obtenir des disques durs et de définir la hauteur de la fenêtre en fonction des nouveaux contrôles ajoutés.

+0

Mille mercis Shining Annatar, c'est exactement ce que je cherchais mate :) –

1

J'ai trouvé l'autre réponse confuse à cause des commentaires en ligne ... l'ajout d'un columnDEFINITION (par exemple) "dessine" absolument RIEN - c'est très trompeur pour les débutants.

De plus: les lignes sont sélectionnées de façon répétée même si elles ont déjà été sélectionnées ... cela ajoute simplement un surcoût inutile. Cela rendra votre application vraiment très lente si vous utilisez plusieurs centaines de lignes.

Identique à la définition de WindowHeight.

est ici un (peu) solution plus efficace pour la ligne dynamique & colonne de gestion VB.NET: (utiliser Dispatcher.BeginInvoke() au lieu de Invoke() si vous souhaitez passer à un traitement asynchrone)

Private Delegate Sub MyDelegate3(ByVal iByte As Byte) 
Private Delegate Function MyDelegate4() As Byte 

Public Property GridColumns As Byte 
     Get 
      Dim del As New MyDelegate4(AddressOf GetColumns) 
      Return grid.Dispatcher.Invoke(del) 
     End Get 

     Set(ByVal value As Byte) 
      Dim del As MyDelegate3 
      If GridColumns > 0 Then 
       Dim diff As SByte = GridColumns - value 
       If diff > 0 Then 'Spalten abziehen 
        del = New MyDelegate3(AddressOf RemColDefs) 
        grid.Dispatcher.Invoke(del, diff) 
       Else    'Spalten hinzufügen 
        del = New MyDelegate3(AddressOf AddColDefs) 
        grid.Dispatcher.Invoke(del, Math.Abs(diff)) 
       End If 
      Else 
       del = New MyDelegate3(AddressOf AddColDefs) 
       grid.Dispatcher.Invoke(del, value) 
      End If 
     End Set 
    End Property 

    Public Property GridRows As Byte 
     Get 
      Dim del As New MyDelegate4(AddressOf GetRows) 
      Return grid.Dispatcher.Invoke(del) 
     End Get 
     Set(value As Byte) 
      Dim del As MyDelegate3 
      If GridRows > 0 Then 
       Dim diff As SByte = GridRows - value 
       If diff > 0 Then 'Zeilen abziehen 
        del = New MyDelegate3(AddressOf RemRowDefs) 
        grid.Dispatcher.Invoke(del, diff) 
       Else    'Spalten hinzufügen 
        del = New MyDelegate3(AddressOf AddRowDefs) 
        grid.Dispatcher.Invoke(del, Math.Abs(diff)) 
       End If 
      Else 
       del = New MyDelegate3(AddressOf AddRowDefs) 
       grid.Dispatcher.Invoke(del, value) 
      End If 
     End Set 
    End Property 

    Private Function GetRows() As Byte 
     Return grid.RowDefinitions.Count 
    End Function 
    Private Function GetColumns() As Byte 
     Return grid.ColumnDefinitions.Count 
    End Function 

    Private Sub AddRowDefs(ByVal iRows As Byte) 
     For r As Byte = 1 To iRows 
      Dim rowDef As New RowDefinition 
      rowDef.Height = GridLength.Auto 
      grid.RowDefinitions.Add(rowDef) 
     Next   
    End Sub 
    Private Sub RemRowDefs(ByVal iRows As Byte) 
     For r As Byte = 1 To iRows 
      If grid.RowDefinitions.Count > 0 Then 
       grid.RowDefinitions.Remove(grid.RowDefinitions(0)) 
      End If 
     Next    
    End Sub 

    Private Sub AddColDefs(ByVal iCols As Byte) 
     For r As Byte = 1 To iCols 
      Dim colDef As New ColumnDefinition 
      colDef.Width = GridLength.Auto 
      grid.ColumnDefinitions.Add(colDef) 
     Next    
    End Sub 
    Private Sub RemColDefs(ByVal iCols As Byte) 
     For r As Byte = 1 To iCols 
      If grid.ColumnDefinitions.Count > 0 Then 
       grid.ColumnDefinitions.Remove(grid.ColumnDefinitions(0)) 
      End If 
     Next    
    End Sub 
Questions connexes