Ahora estoy haciendo una aplicación que muestra el uso de HDD en el sistema. Para eso quiero generar dinámicamente la grilla y los controles (como barra de progreso y etiquetas) para mostrar el uso. ¿Hay alguna plantilla XAML disponible para este propósito?Adición de cuadrícula y controles dinámicamente en WPF
Respuesta
uso el código folowing para generar controles dinámicamente en mi código
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) {}
}
Las funciones GetHardDiskDrives() y SetWindowHeight() son funciones definidas por el usuario. El jpb es para obtener discos duros y Establecer la altura de la ventana de acuerdo con los nuevos controles agregados.
Encontré la otra respuesta confusa debido a los comentarios en línea ... agregar una columnaDEFINICIÓN (por ejemplo) "dibuja" absolutamente NADA - eso es muy engañoso para los principiantes.
También: las filas se seleccionan repetidamente aunque ya se hayan seleccionado ... eso simplemente agrega una sobrecarga inútil. Esto hará que tu aplicación realmente realmente lenta si estás usando cientos de filas.
Lo mismo con la configuración de WindowHeight.
Aquí hay una (un poco) la solución más eficiente para la fila dinámica & columna de gestión en VB.NET: (utilizar Dispatcher.BeginInvoke() en lugar de Invoke() si quiere pasar al procesamiento asíncrono)
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. Espaciado entre controles secundarios en cuadrícula WPF
- 2. Agregar controles dinámicamente en WPF MVVM
- 3. Adición de controles dinámicamente a un UpdatePanel de ASP.NET AJAX
- 4. WPF: Cómo agregar controles dinámicamente en la ventana WPF creada dinámicamente
- 5. Adición de columnas y filas en una fila TableLayoutPanel dinámicamente
- 6. Adición dinámica de elementos de cuadrícula en la vista de cuadrícula
- 7. WPF: ¿cómo cargo dinámicamente los controles de usuario?
- 8. ASP.NET Controles de cuadrícula MVC
- 9. ¿Qué control de cuadrícula/cuadrícula en WPF?
- 10. Agregar controles dinámicamente a controles de usuario
- 11. WPF - ¿Agregar controles dinámicos a Tabitem agregado dinámicamente?
- 12. Controles añadidos dinámicamente en Asp.Net
- 13. WPF Tamaño de la cuadrícula
- 14. Controles WPF en WinForms
- 15. Controles de ajuste de WPF
- 16. Cuadrícula de datos editable en WPF
- 17. Adición optgroups utilizando jQuery dinámicamente
- 18. Establecer columna cuadrícula/Ancho de fila/Altura dinámicamente
- 19. ¿Controles de cuadrícula compatibles con .NET y Mono?
- 20. Controles compuestos de WPF
- 21. Diferencia con la creación y adición de controles en PreInit Init
- 22. Controles que interactúan dentro de una cuadrícula
- 23. Extracción controles creados dinámicamente en C#
- 24. WPF Tooltip con controles
- 25. ¿Cómo diseño un formulario en WPF usando la cuadrícula u otros controles para su mantenimiento?
- 26. ¿Cómo agrego múltiples controles a una DataGridTemplateColumn de una cuadrícula de datos usando wpf?
- 27. ASP.NET crea dinámicamente controles y devolución de datos
- 28. WPF Ocultar columna de cuadrícula
- 29. Unión de cuadrícula de datos en WPF
- 30. Decodificador WPF con controles dentro
Mil gracias Shining Annatar, esto es exactamente lo que estaba buscando mate :) –