在WPF中动态添加网格和控件
我现在正在做一个显示系统中HDD使用情况的应用程序。为此,我希望动态生成网格和控件(如进度条和标签),以显示使用情况。是否有任何XAML模板可用于此目的?我使用以下代码在代码中动态生成控件在WPF中动态添加网格和控件,wpf,xaml,templates,wpf-controls,Wpf,Xaml,Templates,Wpf Controls,我现在正在做一个显示系统中HDD使用情况的应用程序。为此,我希望动态生成网格和控件(如进度条和标签),以显示使用情况。是否有任何XAML模板可用于此目的?我使用以下代码在代码中动态生成控件 Label[]驱动器标签; 标签[]百分比标签; ProgressBar[]驱动程序进度; int drivescont=0; 私有控件() { 尝试 { //正在获取驱动器列表。 List driveList=GetHardDiskDrives(); DriveScont=driveList.Count;
Label[]驱动器标签;
标签[]百分比标签;
ProgressBar[]驱动程序进度;
int drivescont=0;
私有控件()
{
尝试
{
//正在获取驱动器列表。
List driveList=GetHardDiskDrives();
DriveScont=driveList.Count;
//初始化新网格。
网格驱动器网格=新网格();
drivesGrid.Children.Clear();
DrivesBorder.Child=drivesGrid;
//将行和列添加到网格。
RowDefinition[]行=新行定义[2*DriveScont+1];
ColumnDefinition[]columns=新的ColumnDefinition[6];
//划行。
对于(int i=0;i<2*driveScont+1;i++)
{
行[i]=新的行定义();
添加(行[i]);
//设置行高。
行[i]。高度=(0==i%2)?新网格长度(5):新网格长度(25);
}
//绘制列。
对于(int i=0;i<6;i++)
{
columns[i]=新ColumnDefinition();
drivesGrid.ColumnDefinitions.Add(columns[i]);
如果(i%2==0)
{
//设置列宽。
列[i]。宽度=新网格长度(5);
}
}
//设置列宽。
列[1]。宽度=新网格长度(60);
列[3]。宽度=新网格长度(180);
列[5]。宽度=新网格长度(60);
//绘制标签以显示驱动器号。
drivesLabel=新标签[DriveScont];
//绘制进度条以显示驱动器使用情况。
drivesProgress=新进度条[drivesCount];
//绘制标签以显示驱动器使用情况。
percentageLabel=新标签[DriveScont];
//向网格添加标签和进度条。
对于(int i=0,j=1;i
函数getHardDiskDrive()和SetWindowHeight()是用户定义的函数。jpb将根据添加的新控件获取硬盘驱动器并设置窗口高度。我发现另一个答案令人困惑,因为内联注释。。。添加一个columnDEFINITION(例如)“draws”绝对没有什么——这对初学者来说是非常误导的 此外:即使已选定行,也会重复选择这些行。。。这只会增加无用的开销。这将使你的应用程序非常慢,如果你使用几百行 与设置窗口高度相同 在VB.NET中,有一个(某种程度上)更高效的动态行和列管理解决方案: (如果要切换到异步处理,请使用Dispatcher.BeginInvoke()而不是Invoke())
万分感谢闪亮的安娜塔尔,这正是我要找的伴侣:)
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