2

私はWindows Phone 8アプリに取り組んでいます。

表示する項目が 200 を超えるリスト ボックスがあります。

<DataTemplate x:Key="DataTemplate1">
            <Grid VerticalAlignment="Center" HorizontalAlignment="Center">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Border Grid.Row="0" Background="White" Height="400" Width="400" CornerRadius="30,30,30,30">
                </Border>
                <Grid Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Top">
                    <TextBlock HorizontalAlignment="Center" 
                               VerticalAlignment="Center"
                               Margin="5,20,5,5"
                               Foreground="#000000"
                               Text="{Binding Title}"/>
                </Grid>

            </Grid>
        </DataTemplate>

しかし、クラッシュします。100個のアイテムが機能するまでデバッグしましたが、その後クラッシュします。

PhoneApplicationPage_Loaded私が持っている方法では

private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
myList.Add(new MyObject("A","A value"));
            myList.Add(new MyObject("B", "B value"));
            myList.Add(new MyObject("C", "C value"));

and so on... 200 items

ListBoxItems.ItemsSource = myList;
}

どうすればこれを修正できますか?

アップデート :

<ItemsPanelTemplate x:Key="ItemsPanelTemplate">
            <local:CollectionFlowPanel ItemHeight="400" 
                                       ItemWidth="400"
                                       FocusedItemOffset="120" 
                                       UnfocusedItemOffset="20" 
                                       ItemVisibility="5">
                <VirtualizingStackPanel />
            </local:CollectionFlowPanel>
        </ItemsPanelTemplate>
    </phone:PhoneApplicationPage.Resources>

    <Grid x:Name="LayoutRoot" Background="#000000">
        <local:CollectionFlow x:Name="ListBoxItems"
                              ItemTemplate="{StaticResource DataTemplate}" 
                              ItemsPanel="{StaticResource ItemsPanelTemplate}"/>
    </Grid>
4

4 に答える 4

3

リスト ボックスの ItemsPanelTemplate 内に VirtualizingStackPanel があることを確認してください。詳細については、この回答を参照してください

ListBox に必要と思われる XAML は次のとおりです。

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel />
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>
于 2014-06-11T15:04:20.710 に答える
1

リストとグリッドでのデータの視覚化に関する msdn の次のブログを読む必要があります。

リストまたはグリッドでの仮想化の使用

あなたのxamlコード全体を見ないと正確な答えを提案することはできませんが、xaml ListBoxのあなたはcanvas/StackPanelまたはscrollviewerコントロール内に配置されていると思います。

ItemsControl のビューポートのサイズが制限されていない場合、コントロールは仮想化を実行しません。代わりに、コレクション内の各アイテムのアイテム コンテナーを作成します。ビューポート サイズを制限しない一般的なコンテナーには、Canvas、StackPanel、および ScrollViewer があります。親コンテナーによってサイズを変更する代わりに、ItemsControl のサイズを直接設定することにより、この状況で仮想化を有効にすることができます。ここでは、GridView に Height と Width を設定します。これにより、ビューポートのサイズが制限され、ビューポートの外側のアイテムが仮想化されます。

以下は 2 つのシナリオで、1 つはメモリ不足の例外をスローし、もう 1 つは正常に動作します (同じコード ビハインドを使用してテストします)。

1.キャンバスのリストボックス

 <Canvas .....
    <ListBox Name="ListBoxItems".....
    </ListBox>
 </Canvas>

上記のコードは、項目コントロールのビューポートが定義されていないため、メモリ不足の例外をスローします (項目コントロールのポートが定義されており、仮想化が適用される場合、ListBox で幅/高さを定義するよりも Canvas を使用したい場合) 。

2.グリッド内のリストボックス

  <Grid .....
    <ListBox Name="ListBoxItems".....
    </ListBox>
 </Grid>

上記のコードは、仮想化がリストボックスに適用されるため、メモリ不足の例外をスローしません。

これが役立つことを願っています

于 2014-06-11T19:32:22.883 に答える
-1

forループを使ってみましたか?

public List<Fellow> fellowList { get; set; }

private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
{

fellowList = new List<Fellow>();

for (int i = 0; i < 2; i++)
{
    Fellow fellow = new Fellow();
    fellow.x = "B" + i;
    fellow.value = "B Value" + i;
    fellowList.Add(fellow);
}
this.DataContext = this;

ListBoxItems.ItemsSource = fellowList;    

}

public class Fellow
{
public string x { get; set; }
public string value { get; set; }
}

それが役に立てば幸いです..あなたの希望に応じてビューモデルを変更してください

于 2014-06-11T15:07:54.013 に答える
-1

オブジェクトの大きさは?オブジェクトが大きすぎると、一度にすべてをロードできない場合があります。

于 2014-06-11T14:55:03.990 に答える