#silverlight #xaml #windows-phone-7 #listbox #scroll
#silverlight #xaml #windows-phone-7 #список #прокрутка
Вопрос:
У меня есть список на странице xaml для приложения Windows Phone 7. Он начинается пустым, затем я заполняю его некоторыми элементами, как только они извлекаются из веб-службы. Пока что все работает нормально — элементы отображаются в списке, и все кажется нормальным. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь перетащить список для прокрутки вниз (в эмуляторе): я могу прокрутить вниз, но как только я отпускаю кнопку мыши, список возвращается наверх, как будто я его вообще не прокручивал. Есть идеи, почему он будет вести себя таким образом?
<Grid x:Name="ContentPanel" Grid.Row="2" Margin="0,0,0,0" Canvas.ZIndex="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <!-- EDIT: the problem was "Auto" here should have been "*" -->
</Grid.RowDefinitions>
<!-- removed other element for brevity -->
<ListBox Name="InfoBoardListBox" Grid.Row="1" SelectionChanged="InfoBoardListBox_SelectionChanged"
Margin="0,0,0,0" FontSize="26.667" />
</Grid>
И метод, который заполняет список:
foreach (InfoBoard entry in boards.Values) {
item = new ListBoxItem();
item.Content = entry.Name;
item.Name = entry.Id.ToString(); //used to tell which entry was clicked
InfoBoardListBox.Items.Add(item);
}
Ответ №1:
Попробуйте установить высоту второй строки на *
вместо Auto
; Я думаю, это связано с размером, который, по мнению ListBox, соответствует доступное пространство.
Комментарии:
1. Похоже, это устранило проблему. Я искал какую-то информацию о том, что именно
Auto
и*
предполагается делать, пока безуспешно. Из этого примера похоже, чтоAuto
говорится, что нужно определить размер один раз во время начальной загрузки страницы, и*
говорится, что нужно вычислять это всякий раз, когда что-то меняется.2. В контексте определения строки Автоматически означает сделать строку такой же высокой, как ее содержимое, но не выше.
Star
— это доля доступного пространства (т. е. после строк с фиксированной высотой или автоматической высотой). Если у вас есть две строки, для каждой из которых установлено значение*
, то каждая будет иметь половину высоты. Здесь есть некоторая документация: msdn.microsoft.com/en-us/library /…3. Тогда это имеет смысл. Высота списка была бы установлена примерно на 0, поскольку в нем не было содержимого, и его размер либо не изменяется при добавлении элементов, либо уменьшается в нижней части экрана. В последнем случае в нем всегда было бы достаточно места (часть его за пределами экрана) для отображения всех элементов, что объясняло бы их возвращение на место. * — это определенно то поведение, которое я хочу: список, который занимает ровно оставшуюся высоту на экране.