私は現在、システムでのHDDの使用状況を示すアプリケーションを実行しています。そのために、グリッドとコントロール(プログレスバーやラベルなど)を動的に生成して使い方を表示したいと思っています。この目的で使用できるXAMLテンプレートはありますか?WPFでグリッドとコントロールを動的に追加
16
A
答えて
16
Iは
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) {}
}
関数GetHardDiskDrives()とSetWindowHeight()は、ユーザ定義関数で自分のコードで動的にコントロールを生成するためにfolowingコードを使用します。 jpbはハードドライブを取得し、追加された新しいコントロールに従ってウィンドウの高さを設定することです。
1
インラインコメントのために他の答えが混乱していました...列を追加すると(たとえば)「全く描画されません」ということは初心者には間違いです。
また、既に選択されているにもかかわらず、行が繰り返し選択されているだけで、無駄なオーバーヘッドが追加されます。これは、数百行を使用している場合は、アプリケーションが本当に本当に遅くなります。
WindowHeightの設定と同じです。ここで
はVB.NETで動的な行&列の管理のための(やや)より効率的なソリューションです: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
(あなたは非同期処理に切り替えたい場合Dispatcher.BeginInvoke()の代わりに、呼び出しを()を使用)
関連する問題
- 1. wpfグリッドと動的列
- 2. WPF - 動的に追加されたTabitemに動的コントロールを追加しますか?
- 3. WPF:動的に作成されたWPFウィンドウでコントロールを動的に追加する方法
- 4. Silvelight:グリッドの行間にコントロールを動的に追加する方法は?
- 5. WPF +動的コントロール+アクティビティタイマーイベント
- 6. コントロールのリストにコントロールを動的に追加する
- 7. WPFコントロールにカスタムプロパティを追加する
- 8. スタイルwpfにコントロールを追加する
- 9. C#のコントロールの動的追加
- 10. 列の剣道グリッド行にツールチップを動的に追加する
- 11. WP7:動的にアイテムをグリッドに追加する
- 12. 動的に追加されたコントロールとAJAX
- 13. WPFグリッドとその中のコントロールのフォーカス
- 14. VB/C#.netバックグラウンドワーカーでコントロール項目を動的に追加する
- 15. 検証でコントロールを動的に追加する方法
- 16. 静的なコントロールの代わりに動的なコントロールを追加する方法?
- 17. 動的に追加されたコントロールにイベントを追加します。
- 18. WPFで動的なデータグリッドにデータを追加
- 19. 実行時にTableLayoutPanelに動的にコントロールを追加する
- 20. winform c#.netアプリケーションで動的に追加されたコントロールの値を変更する、動的に追加されたコントロールを追跡する方法
- 21. グリッドにボタンとシルバーライトのプレーヤーを動的に追加しますか?
- 22. Jquery - getJSONから動的に追加されたコントロールを追加する
- 23. 動的に生成されたTelerik MVC3グリッド - チェックボックスの追加
- 24. Silverlightコントロールにパルス境界を動的に追加する
- 25. winformにコントロールの配列を動的に追加する
- 26. tabhostにコントロールを動的に追加する際の問題
- 27. c#.netのユーザ選択にコントロールを動的に追加する
- 28. パネルレイアウトの質問にコントロールを動的に追加する
- 29. サーバーサイドのイベントにコントロールを動的に追加する
- 30. Templated User Controlにコントロールを動的に追加しますか?
ありがとうございましたShining Annatar、これはまさに私が相手を探していたものです:) –