0

我有一个 LongListSelector 绑定到对象的 observablecollection 并点击 LongListSelector 会垂直扩展点击的项目。但是,当再次点击时(它会缩小项目),项目的高度保持在展开时的状态。这在列出的数据中留下了巨大的空白。当您再次扩展/收缩它时,问题就消失了,而且每个项目只发生一次,这真的很奇怪。我得到的结论是每个项目模板中的 LongListSelector 网格没有正确更新(它设置为自动)。

我环顾四周,一般的反应是在 itemtemplate 中重置 Grid 的大小。虽然我更喜欢更优雅的解决方案,因为这需要获取 Grid 并重置它的 Height 值。

这是 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。注意:我可以在 LongListSelector 上使用 FindName,但这只会让我获得 DataTemplate(我已经可以使用它的 x:Name 访问它),并且从那里,我无法对 DataTemplate 做任何事情。

如果有人知道解决方案,那就太好了!

谢谢。

4

1 回答 1

0

我通过更改 Visibility 三次来解决此错误,等待每次之间的布局传递。我通过链接 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;
}
于 2013-02-14T17:55:00.927 回答