3

ExpanderView Item (Silverlight ツールキットから) を持つ Panorama コントロールがあります。私のクライアントは、このページをカスタマイズ可能にしたいと考えています。そのため、PanoramaItems、ExpanderView ヘッダー、および ExpanderView コンテンツの 3 つのレベルのバインディングを作成しました。Panorama コントロールの itemssource を設定したときの問題。アイテムが表示されるまでに約 5 秒かかります。

どうすればこれを解決できますか?

C# コード:

private void panorama_Loaded(object sender, RoutedEventArgs e)
{
        this.DataContext = App.Products; 
}

XAML コード:

<controls:Panorama Loaded="panorama_Loaded" x:Name="panorama" ItemsSource="{Binding}">
        <controls:Panorama.ItemTemplate>
            <DataTemplate>
                <ListBox  ItemsSource="{Binding Sub_Products}" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <toolkit:ExpanderView  Header="{Binding}" Expander="{Binding}" ItemsSource="{Binding Sub_Sub_Products}">
                                <toolkit:ExpanderView.ExpanderTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <Image VerticalAlignment="Center" Source="Images/List.png" Width="25" />
                                            <TextBlock Text="{Binding Title}" />
                                        </StackPanel>
                                    </DataTemplate>
                                </toolkit:ExpanderView.ExpanderTemplate>
                                <toolkit:ExpanderView.ItemTemplate>
                                    <DataTemplate>
                                        <Grid Margin="-30,0,0,0" Background="White"  Width="450" Tap="Grid_Tap" >
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="*" />
                                            </Grid.ColumnDefinitions>
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="Auto" />
                                                <RowDefinition Height="*" />
                                            </Grid.RowDefinitions>
                                            <Image Grid.Row="0"  Source="{Binding ImageSource}" />
                                            <StackPanel  VerticalAlignment="Top" Grid.Column="1">
                                                <TextBlock Text="{Binding Title}"  />
                                                <TextBlock Text="{Binding Description}"  />
                                                <Grid>
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="*" />
                                                    </Grid.ColumnDefinitions>
                                                    </Grid>
                                                <TextBlock Margin="0,12,32,0" Grid.Row="1" Text="Learn more" />
                                            </StackPanel>
                                        </Grid>
                                    </DataTemplate>
                                </toolkit:ExpanderView.ItemTemplate>
                            </toolkit:ExpanderView>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </DataTemplate>
        </controls:Panorama.ItemTemplate>
    </controls:Panorama>
4

2 に答える 2

1

画面外にあるパノラマ アイテムを折りたたんで、可視性をオンデマンドにのみ設定することができます。これにより、少なくとも表示されるツリーのサイズが縮小されます。

遅い部分を見つける良い方法は、Visual Studio でプロファイラーを使用することです。本当に遅いフレームが 1 つ見つかります (この場合、レンダリング時間は 5 秒です)。次に、そのフレームのビジュアル ツリーを掘り下げて、レンダリングに時間がかかった要素を確認し、これらの最適化を試みます。

于 2012-05-12T17:45:44.307 に答える
0

xaml の ExpanderView ItemsSource バインディングを削除し、コードで Expander を操作するときにバインドします。そのままにしておきますItemsSource="{Binding}"。そうすれば、ユーザーがエキスパンダーをタップすると、ビジュアル ツリーが動的に構築されます。

イベントハンドラは以下のようなものです。Product が App.Products list のタイプであると想定しています。また、エキスパンダーの xaml でイベントをフックしていることを確認してください。

 private void ExpanderView_ManipulationStarted(object sender, System.Windows.Input.ManipulationStartedEventArgs e)
        {
            var expander = sender as ExpanderView;
            expander.ItemsSource = (expander.DataContext as Product).Sub_Sub_Products;
        }

これにより、読み込みが遅い問題が解決され、現時点で手遅れになることはありません.

于 2013-08-14T09:08:49.303 に答える