Jestem teraz robi aplikację, która pokazuje użycie dysku twardego w systemie. W tym celu chcę dynamicznie generować siatkę i kontrolki (takie jak pasek postępu i etykiety), aby pokazać użycie. Czy istnieje jakiś szablon XAML do tego celu?Dodawanie siatki i steruje dynamicznie w WPF
Odpowiedz
użyć kodu folowing generować dynamicznie formantów w moim kodu
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) {}
}
Funkcje GetHardDiskDrives() i SetWindowHeight() to funkcje zdefiniowane przez użytkownika. Jpb ma dostać dyski twarde i ustawić wysokość okna zgodnie z dodanymi nowymi kontrolkami.
Znalazłem inną odpowiedź zagmatwaną ze względu na wbudowane komentarze ... dodanie kolumnyDEFINITION (na przykład) "rysuje" absolutnie NIC - to bardzo mylące dla początkujących.
Również: wiersze są wybierane wielokrotnie, nawet jeśli zostały już wybrane ..., co po prostu dodaje niepotrzebny narzut. Spowoduje to, że Twoja aplikacja będzie naprawdę powolna, jeśli używasz kilkuset wierszy.
samo z ustawieniem WindowHeight.
Oto (nieco) bardziej efektywne rozwiązanie dla dynamiczny wiersz & kolumnie zarządzania w VB.NET: (użyj Dispatcher.BeginInvoke() zamiast Invoke(), jeśli chcesz, aby przełączyć się do przetwarzania asynchronicznego)
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. Dodawanie i usuwanie fragmentów dynamicznie w ViewPager
- 2. Limity rozciągania siatki - WPF
- 3. Ustaw kolumnę siatki/szerokość wiersza/wysokość dynamicznie
- 4. WPF - Dodawanie dynamicznych elementów sterujących do dynamicznie dodawanych Tabitem?
- 5. Dodawanie geometrii do siatki three.js po renderowaniu
- 6. Dodawanie formantów JavaFX2 dynamicznie
- 7. Jak mogę zmienić kolor linii siatki siatki w WPF?
- 8. Dodawanie TabItems dynamicznie
- 9. Zmiana stylu dynamicznie w WPF
- 10. Separator WPF między przyciskami siatki
- 11. Jak wyczyścić zawartość siatki WPF?
- 12. WPF Dynamicznie zmieniaj plik zasobu i motyw
- 13. Która tabela/kontrola siatki w WPF?
- 14. Wyświetlacz TreeViewItem jak wierszy siatki w WPF
- 15. WPF C# Programowe dodawanie i przenoszenie kart
- 16. Dynamicznie dodawaj wiersze/kolumny do siatki
- 17. Dodawanie dynamicznie formantu do winforma
- 18. dynamicznie dodawanie atrybutów obiektu Ruby
- 19. Dodawanie wierszy i kolumn w tabeli z jQuery dynamicznie
- 20. Dodawanie klas jednostek dynamicznie w środowisku wykonawczym
- 21. WPF siatki danych doborze zawartości kolumny matrycy
- 22. Siatka WPF jako ItemsPanel dla listy dynamicznie powiązanej z ItemsControl
- 23. Jak narysować linię siatki na płótnie WPF?
- 24. Jak dynamicznie zmieniać kolejność kolumn w widoku siatki?
- 25. Jak dynamicznie ustawić siatki wyboru Model wyboru CheckBox w ExtJs4?
- 26. Dynamicznie dodawaj podpowiedzi do wierszy siatki kendo w kolumnie
- 27. Jak mogę dynamicznie dodać obiekt RowDefinition do siatki w ItemPanelTemplate?
- 28. Dynamiczne dodawanie elementów sterujących w WPF MVVM
- 29. WPF Dodawanie niestandardowej właściwości w formancie
- 30. Dodawanie kolumn i wierszy do wiersza tablelayoutpanel dynamicznie
Tysiąc dzięki Olśniewająca Annatar, właśnie tego szukałem, kolego :) –