0

オブジェクトの観察可能なコレクションにバインドされた LongListSelector があり、LongListSelector をタップすると、タップされたアイテムが垂直方向に展開されます。ただし、もう一度タップすると (アイテムが縮小されます)、アイテムの高さは拡大されたときのままです。これにより、リストされているデータに大きなギャップが残ります。もう一度拡大/縮小すると問題はなくなりますが、これはアイテムごとに1回だけ発生します。これは非常に奇妙です。私が得た結論は、各項目テンプレートの LongListSelector グリッドが正しく更新されていない (Auto に設定されている) ということです。

私は周りを見回しましたが、一般的な応答は、itemtemplate でグリッドのサイズをリセットすることです。グリッドを取得して高さの値をリセットする必要があるため、私ははるかにエレガントなソリューションを好みます。

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 を 3 回変更し、その間にレイアウト パスが入るのを待ちました。以下に示すように、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 に答える