让我们以此代码为基础:
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="50" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button
x:Name="_buttonAdd"
Grid.Row="0"
Click="_buttonAdd_Click"
Content="Daten hinzufügen" />
<Button
x:Name="_buttonDel"
Grid.Row="1"
Click="_buttonDel_Click"
Content="Daten löschen" />
<DataGrid
x:Name="_dataGrid"
Grid.Row="2"
MinHeight="200"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
AutoGenerateColumns="True"
ItemsSource="{Binding Path=MitarbeiterList}"
VerticalScrollBarVisibility="Auto">
</DataGrid>
</Grid>
</ScrollViewer>
如果DataGrid的MinHeight低于200,我只想滚动ScrollViewer。 另一方面,我希望ScrollViewer不滚动,如果MinHeight超过或者在 换句话说:我希望DataGrid垂直伸展到可见区域并显示它 如有必要,自己拥有滚动条。
我希望你们能解决我的问题。
提前感谢。
答案 0 :(得分:2)
在编写代码时,Grid的前两行的最小高度始终为300:50,而DataGrid的最小高度为200(由MinHeight属性设置)。如果此Grid的容器(或实际上,您声明的ScrollViewer)变得小于此值,则ScrollViewer将显示其垂直ScrollBar。
就个人而言,除非您的容器小于Buttons的大小加上一些DataGrid,否则我只需删除外部ScrollViewer。我无法确定,但我相信这会给你你想要的功能。
按钮始终可见,DataGrid将填充剩余空间。如果DataGrid需要的空间大于可见空间,则其ScrollBar将自动显示。
我可能要做的另一件事是将按钮水平放置在彼此旁边 - 这不仅可以清理UI,还可以节省一些空间。您甚至可以使行自动调整大小,并相应地调整按钮的大小。
总之,它可能看起来像这样(我可能也会为按钮创建一个样式,但你明白了):
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button
x:Name="_buttonAdd"
Grid.Column="0"
Grid.Row="0"
HorizontalAlignment="Left"
Margin="5"
Click="_buttonAdd_Click"
Content="Daten hinzufügen" />
<Button
x:Name="_buttonDel"
Grid.Column="1"
Grid.Row="0"
HorizontalAlignment="Right"
Margin="5"
Click="_buttonDel_Click"
Content="Daten löschen" />
<DataGrid
x:Name="_dataGrid"
Grid.Column="0"
Grid.Row="1"
Grid.ColumnSpan="2"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
AutoGenerateColumns="True"
ItemsSource="{Binding Path=MitarbeiterList}"
VerticalScrollBarVisibility="Auto">
</DataGrid>
</Grid>
答案 1 :(得分:2)
感谢您的回答Wonko。删除滚动查看器不是关键,但我可以理解您的想法。我终于以我的方式做到了,在MaxHeight上进行了多重绑定:
<DataGrid
x:Name="_dataGrid"
Grid.Column="0"
Grid.Row="1"
Grid.ColumnSpan="2"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
AutoGenerateColumns="True"
ItemsSource="{Binding Path=MitarbeiterList}"
VerticalScrollBarVisibility="Auto">
<DataGrid.MaxHeight>
<Multibinding Converter="{StaticResource MaxHeightConverter}">
<Binding Path="ActualHeight"
ElementName="_hostingWindow" />
<Binding Path="DataGridLocationPoint" />
</Multibinding>
</DataGrid.MaxHeight>
</DataGrid>
MaxHeightConverter只是使用DataGrid-Location的Y坐标减去窗口的ActualHeight:所以这将DataGrid的MaxHeight始终设置为窗口的剩余可用区域。更改窗口大小时设置DataGridLocationPoint。像这样:
public void dataGrid_SizeChanged(...)
{
GeneralTransform transform = dataGrid.TransformToAncestor(this);
Point DataGridLocationPoint = transform.Transform(new Point(0, 0));
}
(抱歉,代码可能无法运行,因为我是从脑中写出来的)