ScrollViewer прокручивается только тогда, когда содержимое minHeight падает ниже - PullRequest
2 голосов
/ 11 января 2011

Давайте возьмем этот код за основу:

<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>

Я хочу, чтобы ScrollViewer только прокручивался, если MinHeight DataGrid падает ниже 200. С другой стороны, я хочу, чтобы ScrollViewer не прокручивалMinHeight превышает или другими словами: я хочу, чтобы DataGrid растягивался вертикально до видимой области и отображал собственную полосу прокрутки, если необходимо.

Я надеюсь, что вы, ребята, можете решить мою проблему.

спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 11 января 2011

Спасибо за ваш ответ 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 просто вычитает ActualHeight окна с Y-координатой DataGrid-Location: таким образом, устанавливается MaxHeight DataGridвсегда до оставшейся доступной области окна.DataGridLocationPoint устанавливается при изменении размера окна.Например:

public void dataGrid_SizeChanged(...)
{    
        GeneralTransform transform = dataGrid.TransformToAncestor(this);
        Point DataGridLocationPoint = transform.Transform(new Point(0, 0));
}

(извините, код может не работать, потому что я написал его из моего мозга)

2 голосов
/ 11 января 2011

После написания кода минимальная высота сетки всегда будет составлять 300: 50 для первых двух строк, плюс 200 для DataGrid (как установлено в свойстве MinHeight). Если контейнер этой таблицы (или, фактически, ScrollViewer, который вы объявили) становится меньше этого, ScrollViewer покажет свою вертикальную полосу прокрутки.

Лично, если ваш контейнер не будет меньше размера кнопок и некоторой части DataGrid, я бы просто удалил внешний ScrollViewer. Я не могу сказать наверняка, но я верю, что это даст вам желаемую функциональность.

Кнопки всегда будут видны, а DataGrid заполнит оставшееся пространство. Если DataGrid нужно больше места, чем видно, его ScrollBar автоматически отобразится.

Еще одна вещь, которую я, вероятно, хотел бы сделать, это расположить кнопки рядом друг с другом горизонтально - это не только очистит пользовательский интерфейс, но и сэкономит вам немного недвижимости. Вы можете даже изменить размер строки и соответственно изменить размер кнопок.

В целом, это может выглядеть примерно так (я бы, наверное, также сделал стиль для кнопок, но вы поняли):

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...