Silverlight 4 - ScrollViewer и дочерняя DataGrid MinHeight - PullRequest
3 голосов
/ 18 мая 2011

edit: я переписываю почти весь вопрос, потому что понял, что вопрос неверный и запутанный.Я прошу прощения за это, но у вопроса были неправильные предположения, которые делали невозможным ответить.Первоначально я пытался упростить его, чтобы было легче понять, но это сделало невозможным копирование моей проблемы.

Если бы у меня было DataGrid с MinHeight в ScrollViewer, я бы ожидалчто при уменьшении моего ViewPort ActualHeight элемента будет уменьшаться до тех пор, пока он не достигнет MinHeight, прежде чем появятся полосы прокрутки.

Вместо этого кажется, что когда совокупность высот строк в сетке данных составляет болееMinHeight, это значение переопределяет MinHeight

Есть ли способ сделать это без ручного определения размера и тонны кода?

Пример:

<ScrollViewer VerticalScrollBarVisibility="Auto" Background="Red">
    <Grid x:Name="LayoutRoot" Background="Black" HorizontalAlignment="Stretch">
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="20"/>
            <RowDefinition Height="80"/>
        </Grid.RowDefinitions>

        <sdk:DataGrid AutoGenerateColumns="True" Name="dataGrid1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" MinHeight="20" />
        <Rectangle Fill="Blue" Width="100" Height="80" Grid.Row="1" />
    </Grid>
</ScrollViewer>

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

Если вы заменитеDataGrid с другим прямоугольником, поведение отличается (очевидно).Новый прямоугольник уменьшится до высоты 20.

Как мне добиться этого с помощью сетки?Мои требования должны иметь вложенные полосы прокрутки на моей странице SL (что я считаю неприятным, но это не в моем контроле).Идея состоит в том, что полосы прокрутки верхнего уровня являются своего рода «последним средством».

Ответы [ 3 ]

1 голос
/ 03 июня 2011

Что по этому поводу:

<ScrollViewer>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="250" />
    </Grid.RowDefinitions>      
    <Rectangle MinHeight="150" Background="Red" Grid.Row="0" />
    <Rectangle Height="250" Background="Blue" Grid.Row="1" />
</Grid>

Вы не установили значения Grid.Row ни для одного из прямоугольников.

1 голос
/ 03 июня 2011

Вы не предоставили достаточно информации для решения вашей конкретной проблемы. Тем не менее, легко продемонстрировать, что ScrollViewer работает именно так, как вы хотите, перебравшись к чему-то простому:

<UserControl ...>
    <ScrollViewer VerticalScrollBarVisibility="Auto">
        <Border MinHeight="200" BorderBrush="Blue" BorderThickness="1" Background="Red"/>
    </ScrollViewer>
</UserControl>

Поместите это в отдельное приложение Silverlight на главной странице, и вы увидите, что ScrollViewer отображает вертикальную полосу прокрутки только тогда, когда окно достаточно маленькое. Вы можете скачать решение здесь .

0 голосов
/ 05 июня 2011

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

Другим вариантом будет изменение шаблона элемента управления scrollviewer и удаление границы и дополнительного пространства, занимаемого вокруг предъявителя контента. И установите горизонтальную прокрутку видимости в свернутом виде, чтобы она не занимала пространство.

...