Ora sto facendo un'applicazione che mostra l'utilizzo dell'HDD nel sistema. Per questo voglio generare la griglia e i controlli (come la barra di avanzamento e le etichette) in modo dinamico per mostrare l'utilizzo. C'è un modello XAML disponibile per questo scopo?Aggiunta griglia e controlli dinamici in WPF
risposta
io uso il codice folowing per generare dinamicamente i controlli nel mio codice
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) {}
}
Le funzioni GetHardDiskDrives() e SetWindowHeight() sono funzioni definite dall'utente. Il jpb è quello di ottenere harddrives e impostare l'altezza della finestra in base ai nuovi controlli aggiunti.
Ho trovato l'altra risposta confusa a causa dei commenti in linea ... aggiungendo una colonna DEFINIZIONE (ad esempio) "disegna" assolutamente NULLA - questo è molto fuorviante per i principianti.
Inoltre: le righe vengono selezionate ripetutamente anche se sono già state selezionate ... che aggiunge solo inutili spese generali. Ciò renderà la tua app davvero molto lenta se utilizzi diverse centinaia di righe.
Uguale all'impostazione di WindowHeight.
Ecco una (un po ') la soluzione più efficiente per la riga dinamica & colonna-gestione in VB.NET: (utilizzare Dispatcher.BeginInvoke() al posto di Invoke() se si desidera passare alla elaborazione asincrona)
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
- 1. WPF - Aggiunta di controlli dinamici per aggiungere Tabitem dinamicamente?
- 2. Spaziatura tra i controlli figlio nella griglia WPF
- 3. Controlli WPF ridimensionabili dall'utente?
- 4. griglia wpf con colonna congelata
- 5. Android: Mettere Griglia di oggetti dinamici e personalizzati all'interno di un'altra Griglia di oggetti dinamici e personalizzati
- 6. Inserire i controlli dinamici nel mezzo della collezione di controlli
- 7. Controlli dinamici creati all'interno di UpdatePanel?
- 8. WPF Tooltip con controlli
- 9. griglia wpf con colonne dinamiche
- 10. Controlli grafico WPF
- 11. Controlli compositi WPF
- 12. WPF Nascondi griglia Colonna
- 13. Aggiunta dinamica di controlli JavaFX2
- 14. ASP.NET: aggiunta controlli lato client
- 15. Controlli WPF e Silverlight e funzionalità di panoramica e zoom
- 16. finestre SlimDX a controlli WPF
- 17. Come utilizzare i controlli personalizzati in WPF
- 18. Smaltimento dei controlli utente WPF
- 19. Hosting di controlli WPF in Winform
- 20. Come creare moduli di inserimento dati dinamici in un'applicazione WPF?
- 21. linee griglia wpf - cambio stile
- 22. Modifica colore sfondo riga griglia in WPF
- 23. Pannello ExtJs - aggiunta di componenti dinamici
- 24. aggiunta visibilità condizionale al controllo WPF ToolTip
- 25. Come posso allineare rapidamente i controlli in una finestra WPF?
- 26. Bordi inferiori sulla griglia WPF
- 27. Limite larghezza massima della colonna "automatico" in griglia WPF
- 28. ASP.NET: Viewstate e aggiunta programmatica dei controlli utente
- 29. Effetto Innescato WPF passaggio del mouse per bambini Controlli
- 30. ASP .NET: controlli di carico dinamici vs Visible = true
Mille grazie Shining Annatar, questo è esattamente quello che cercavo amico :) –