英文:
WPF RowDefinition "collapse" as set height to 0 when Actualheight below threshold
问题
在我的应用程序中,我使用代码生成GUI元素,并将它们绑定到对象列表的属性上。
这些GUI元素中包含了一个包括TextEdits(devexpress)、小图标和SpinEdits(devexpress)等各种其他元素的网格。
它们受窗口大小的影响。如果大小变得太小,控件会被挤压,文本将无法阅读,看起来很糟糕。
第一行应该始终可读。我用以下代码实现了这一点:
``` lang-vbnet
newRow1.MinHeight = 30
现在我想根据它们的实际大小来“折叠”其他行。例如,如果它们的高度小于30像素,我想将它们折叠起来,因为它们的内容无论如何都无法阅读。
如果窗口放大,它们应该再次变得可见。
这看起来很有前途,但是因为行没有Visibility属性,我不知道如何调整这个解决方案。
https://stackoverflow.com/questions/42009617/can-i-trigger-an-event-in-xaml-when-a-control-is-less-than-a-certain-height
这是我在代码中创建网格的方式:
Dim NewGridSchalter As New System.Windows.Controls.Grid
Dim newRow1 As New RowDefinition
Dim newRow2 As New RowDefinition
Dim newRow3 As New RowDefinition
newRow1.MinHeight = 30
NewGridSchalter.RowDefinitions.Add(newRow1)
NewGridSchalter.RowDefinitions.Add(newRow2)
NewGridSchalter.RowDefinitions.Add(newRow3)
Dim NewColumnBild As New ColumnDefinition
Dim NewColumnText As New ColumnDefinition
NewGridSchalter.ColumnDefinitions.Add(NewColumnBild)
NewGridSchalter.ColumnDefinitions.Add(NewColumnText)
NewGridSchalter.ShowGridLines = False
NewGridSchalter.HorizontalAlignment = HorizontalAlignment.Stretch
NewGridSchalter.VerticalAlignment = VerticalAlignment.Stretch
之后,网格会被修改并填充其他控件。
如果可能的话,我不想单独折叠控件。
它必须是一个网格。我尝试过使用堆栈面板或停靠面板,但我需要在其中放置控件并控制它们占用多少空间的能力。
<details>
<summary>英文:</summary>
In my application I generate GUI-elements in code and bind them to properties in a list of objects.
Each of these GUI-elements contains a Grid with various other elements like TextEdits (devexpress), small icons and SpinEdits(devexpress).
They are subjective to the window size. If the size gets to small the controls will get squeezed and text is no longer readable and it looks awful.
The first row should always be readable. I achieved this with
``` lang-vbnet
newRow1.MinHeight = 30
Now I want to "collapse" the other rows depending on their actual size. Per example if they have <30 px height I want to collapse them because their content isn't readable anyway.
If the window is enlarged they should become visible again.
This looks promising but because rows don't have a Visibility property I don't know how to adapt this solution.
https://stackoverflow.com/questions/42009617/can-i-trigger-an-event-in-xaml-when-a-control-is-less-than-a-certain-height
This is how I create the Grid in code
Dim NewGridSchalter As New System.Windows.Controls.Grid
Dim newRow1 As New RowDefinition
Dim newRow2 As New RowDefinition
Dim newRow3 As New RowDefinition
newRow1.MinHeight = 30
NewGridSchalter.RowDefinitions.Add(newRow1)
NewGridSchalter.RowDefinitions.Add(newRow2)
NewGridSchalter.RowDefinitions.Add(newRow3)
Dim NewColumnBild As New ColumnDefinition
Dim NewColumnText As New ColumnDefinition
NewGridSchalter.ColumnDefinitions.Add(NewColumnBild)
NewGridSchalter.ColumnDefinitions.Add(NewColumnText)
NewGridSchalter.ShowGridLines = False
NewGridSchalter.HorizontalAlignment = HorizontalAlignment.Stretch
NewGridSchalter.VerticalAlignment = VerticalAlignment.Stretch
After that the grid is changed and filled with other controls.
If possible I don't want to collapse the controls individually.
It has to be a grid. I tried this with stackpanels or dockpanels but I need the ability to place controls in there where I want them to and how much space they get.
答案1
得分: 0
这是你要翻译的部分:
找到了一个解决方案。
可以将以下代码添加到我提出的问题的代码末尾。重要的是要使用网格的SizeChanged事件,而不是行的SizeChanged事件,否则它会开始跳来跳去。
AddHandler NewGridSchalter.SizeChanged, Function()
If NewGridSchalter.ActualHeight < 70 Then
newRow2.Height = New GridLength(0, GridUnitType.Pixel)
newRow3.Height = New GridLength(0, GridUnitType.Pixel)
Else
newRow2.Height = New GridLength(1, GridUnitType.Star)
newRow3.Height = New GridLength(1, GridUnitType.Star)
End If
End Function
英文:
Found a solution.
This piece of code can be added to the end of the code in my question. Its important to use the SizeChanged event of the grid and not of a row otherwise it will start to jump around.
AddHandler NewGridSchalter.SizeChanged, Function()
If NewGridSchalter.ActualHeight < 70 Then
newRow2.Height = New GridLength(0, GridUnitType.Pixel)
newRow3.Height = New GridLength(0, GridUnitType.Pixel)
Else
newRow2.Height = New GridLength(1, GridUnitType.Star)
newRow3.Height = New GridLength(1, GridUnitType.Star)
End If
End Function
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论