XAML LongListSelector не обновляет размер шаблона элемента

У меня есть LongListSelector, привязанный к наблюдаемой коллекции объектов, и нажатие на LongListSelector расширяет выбранный элемент по вертикали. Однако при повторном нажатии (при этом элемент сжимается) высота элемента остается такой же, как при расширении. Это оставляет огромный пробел в перечисленных данных. Проблема исчезает, когда вы снова расширяете / сжимаете его, и это происходит ТОЛЬКО один раз для каждого элемента, это действительно довольно странно. Я пришел к выводу, что сетка LongListSelector в каждом шаблоне элементов обновляется некорректно (для нее установлено значение «Авто»).

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

Вот код для LongListSelector:

<phone:LongListSelector x:Name="all_items_list" Margin="0,0,-12,0" ItemsSource="{Binding All_Items}" Tap="item_list_Tap" ItemTemplate="{StaticResource all_down_template}"/>

И это ItemTemplate:

    <DataTemplate x:Key="all_down_template" x:Name="template">
            <Grid x:Name="grid" Margin="0,0,0,15">
                <!--Show this when shrunk-->
                <TextBlock Text="{Binding Name}" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="19" Height="25" VerticalAlignment="Top" Margin="45,0,10,0" TextWrapping="Wrap"/>

                <!-- Show this when expanded -->
                <ProgressBar Value="{Binding Percent}" Foreground="{Binding ProgressBar}" BorderBrush="{Binding ProgressBar}" Margin="34,20,0,0" HorizontalAlignment="Left" Width="421" Height="25" Visibility="{Binding Visibility}" VerticalAlignment="Top"/> 
            </Grid>
    </DataTemplate>

Но во всех примерах ни один из них не использует LongListSelector. Я просмотрел все функции в LongListSelector, и, похоже, ни один из них не отображает выбранные элементы ItemTemplate. Примечание. Я могу использовать FindName в LongListSelector, но это дает мне только DataTemplate (к которому у меня уже был доступ, используя его x: Name), и оттуда я ничего не могу сделать с DataTemplate.

Если кто-нибудь знает решение, это было бы здорово!

Спасибо.


person Travv92    schedule 23.11.2012    source источник
comment
У меня такая же проблема с LLS в WP8, в WP7 это работает как шарм. Я обнаружил, что когда он сжимает мои элементы по вертикали, MeasureOverride и ArrangeOverride не вызываются. И хотя его размер был изменен должным образом, эти методы вызываются. Странное поведение.   -  person Nazar Grynko    schedule 06.10.2013


Ответы (1)


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

private void OnToggleText(object sender, System.Windows.Input.GestureEventArgs e)
{
    Grid g = (Grid)sender;
    g.Children[1].Visibility = g.Children[1].Visibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
    g.SizeChanged += g_SizeChanged;
}

void g_SizeChanged(object sender, SizeChangedEventArgs e)
{
    Grid g = (Grid)sender;
    g.SizeChanged -= g_SizeChanged;
    g.SizeChanged += g_SizeChanged2;
    g.Children[1].Visibility = g.Children[1].Visibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
}

void g_SizeChanged2(object sender, SizeChangedEventArgs e)
{
    Grid g = (Grid)sender;
    g.SizeChanged -= g_SizeChanged2;
    g.Children[1].Visibility = g.Children[1].Visibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
}
person user2073092    schedule 14.02.2013