Adding Grid and Controls dynamically in WPF

后端 未结 2 977
夕颜
夕颜 2021-02-04 04:01

I am now doing an application that shows the HDD usage in the system. For that I want to generate the grid and the controls (like progress bar and labels) dynamically to show th

2条回答
  •  我在风中等你
    2021-02-04 04:21

    I found the other answer confusing because of the inline-comments... adding a columnDEFINITION (for example) "draws" absolutely NOTHING - that's very misleading for beginners.

    Also : the rows are selected repeatedly even though they have already been selected ... that just adds useless overhead. This will make your app really really slow if you're using several hundred rows.

    Same with setting the WindowHeight.

    Here's a (somewhat) more efficient solution for dynamic row&column-management in VB.NET: (use Dispatcher.BeginInvoke() instead of Invoke() if you want to switch to asynchronous processing)

    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
    

提交回复
热议问题