ListBox содержится в ScrollViewer - PullRequest
       49

ListBox содержится в ScrollViewer

0 голосов
/ 12 августа 2011

Хотелось бы, чтобы ScrollViewer страницы отображался, когда вся информация не может быть отображена на экране (то есть изменить размер окна) Тем не менее, ListBox здесь не получает прокрутку, и он получает эскиз до нижней части страницы, если я не установил для него MaxSize. Есть ли способ дать приоритет ListBox для отображения его ScrollViewer перед тем, который я сделал?

что у меня сейчас http://i.imgur.com/bEJcz.png

того, чего я хотел бы достичь, но я использовал MaxHeight для ListBox здесь .

Вот моя разметка:

<ScrollViewer HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto"  Name="scrollViewer1"  VerticalAlignment="Stretch" >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <ComboBox Grid.Row="0" Width="120" HorizontalAlignment="Left"></ComboBox>
            <ListBox HorizontalAlignment="Left" Name="listBox" Width="120" Grid.Row="1" <!--MaxHeight="500"--> />
        </Grid>         
    </ScrollViewer>

Ответы [ 5 ]

2 голосов
/ 22 января 2012

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

Многое из того, что у меня естьread гласит, что использование таких вещей, как StackPanel, в этом случае является плохим, потому что панель растет в соответствии с элементами, которые она содержит.Обычно это работает нормально, потому что вы можете вставить StackPanel в сетку и установить MinHeight и MaxHeight столбца / строки и зафиксировать элементы управления на месте.Как только ScrollView добавлен, этот вид идет в ад.Ответ выше хорошо описывает проблему, но не имеет решения.

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

Введите хак:

Мой рост был слишком малсоздание странного всегда закадрового ListBox (на самом деле 36 пикселей слишком велико, что было высотой надписи над ListBox).Поэтому я реализовал IValueConverter:

class HeightToAdjustedHeightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var height = (double) value - 33d;
        return height < 360d ? 360d : height;
        //360 being the minimum height allowed for the listbox
    }

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}

}

Все, что я сделал после этого, включил его в качестве конвертера для привязки в MaxHeight (обратите внимание, что вам нужно назвать свой usercontrol и связать сx: Name):

<Grid Grid.Column="0"
    Grid.Row="1"
    VerticalAlignment="Top"
    ClipToBounds="True"
    MaxHeight="{Binding ElementName=AdHocUserControl, Path=ActualHeight, Converter={StaticResource HeightToAdjustedHeightConverter}}">

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

1 голос
/ 12 августа 2011

У вас есть логическое несоответствие в ваших определениях.

Требование, как вы это сформулировали: «Я бы хотел, чтобы средство просмотра страницы отображалось, когда вся информация не может быть отображена на экране [без использования MaxHeight]» - возникает вопрос: «Какопределить, что «вся информация не может быть отображена на экране»?или "В какой момент ListBox должен перестать расти и показывать полосу прокрутки?"плюс высота поля со списком больше, чем ViewportHeight средства просмотра прокрутки - вы получаете полосу прокрутки.Это возможно только тогда, когда вы позволите ListBox увеличиться до желаемого размера без полос прокрутки.

1 голос
/ 12 августа 2011

Попробуйте это

<ScrollViewer HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto"  Name="scrollViewer1"  VerticalAlignment="Stretch" >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <ComboBox Grid.Row="0" Width="120" HorizontalAlignment="Left" ></ComboBox>
            <ListBox HorizontalAlignment="Left"  Name="listBox"  Width="120" VerticalAllignment = "Top" Grid.Row="1"/>
        </Grid>

    </ScrollViewer>

Или вы также можете попробовать это

  <Grid >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <ComboBox Grid.Row="0" Width="120" HorizontalAlignment="Left" ></ComboBox>
            <ListBox HorizontalAlignment="Left"  Name="listBox" VerticalAlignment= "Top"  Width="120" Grid.Row="1" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
        </Grid>
0 голосов
/ 17 февраля 2013

Другое решение:

<ScrollViewer HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto" Name="scrollViewer1" VerticalAlignment="Stretch" >
<Grid>
   <Grid.RowDefinitions>
     <RowDefinition Height="Auto"/>
     <RowDefinition Height="*"/>
   </Grid.RowDefinitions>
 <ComboBox Grid.Row="0" Width="120" HorizontalAlignment="Left"></ComboBox>
 <ScrollViewer x:Name="scrollViewer" Grid.Row="1" ScrollViewer.VerticalScrollBarVisibility="Disabled" >
    <ListBox HorizontalAlignment="Left" Name="listBox" Width="120" Grid.Row="1" MaxHeight="{Binding ActualHeight, ElementName=scrollViewer}" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
  </ScrollViewer>
</Grid>         

0 голосов
/ 12 августа 2011

Не устанавливайте MaxHeight на ListBox, просто используйте звездочку '*' в вашем RowDefinitions, чтобы получить правильный размер между двумя вашими элементами управления.

...