当内容minHeight低于此值时,ScrollViewer仅可滚动

时间:2011-01-11 10:22:06

标签: wpf xaml

让我们以此代码为基础:

<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垂直伸展到可见区域并显示它 如有必要,自己拥有滚动条。

我希望你们能解决我的问题。

提前感谢。

2 个答案:

答案 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));
}

(抱歉,代码可能无法运行,因为我是从脑中写出来的)