2

実際にユーザーに表示せずに WPF でリストを「事前レンダリング」する方法はありますか? ユーザーに最初に表示されるときに、かなりゆっくりと (数秒) レンダリングされるリストがあります。

リストをユーザーに表示するのにかかる数秒が目立たないように、リストを事前にレンダリング/事前描画したいと思います。アプリの起動中、つまりスプラッシュ画面が表示されている間、これが発生することを望みます。

これを達成するための最良の方法は何ですか?

編集:

これが私のリストアイテムのスタイルです。ご覧のとおり、ターゲット タイプはボタンです。ボタンには RoutedEvent (コマンド) も設定されています。

<Style x:Key="Button_ProductFinder_Item" TargetType="Button">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">

                <Grid Width="690" Height="181"   >

                    <Image Name="Up" Source="{StaticResource Img_ProductFinder_FriendUp}" Stretch="Uniform"/>
                    <Image Name="Down" Source="{StaticResource Img_ProductFinder_FriendDn}" Visibility="Hidden" Stretch="Uniform"/>

                    <Canvas Name="Clip" ClipToBounds="True" Height="162" Width="175" HorizontalAlignment="Left" Margin="0,10,0,0" >
                        <Image Name="DynamicFriend"  Stretch="UniformToFill" Canvas.Left="16" Canvas.Top="-10" HorizontalAlignment="Left"  Source="{Binding ImageSource}" Height="162" Width="162" />
                        <Canvas.RenderTransform>
                            <TransformGroup>
                                <TranslateTransform />
                            </TransformGroup>
                        </Canvas.RenderTransform>
                    </Canvas>

                    <TextBlock Name="DynamicName" Margin="210,69,0,0"  Style="{StaticResource ButtonFriend_Textstyle}"
                                   TextWrapping="Wrap" HorizontalAlignment="Left" Width="440" VerticalAlignment="Stretch" Height="Auto" 
                                   Text="{Binding ProductName}"  />
                </Grid>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="Up" Property="Visibility" Value="Hidden"/>
                        <Setter TargetName="Down" Property="Visibility" Value="Visible"/>
                        <Setter TargetName="Clip" Property="RenderTransform">
                            <Setter.Value>
                                <TransformGroup>
                                    <TranslateTransform Y="2"/>
                                </TransformGroup>
                            </Setter.Value>
                        </Setter>
                        <Setter TargetName="DynamicName" Property="RenderTransform">
                            <Setter.Value>
                                <TransformGroup>
                                    <TranslateTransform Y="2"/>
                                </TransformGroup>
                            </Setter.Value>
                        </Setter>
                        <Setter TargetName="DynamicName" Property="Foreground" Value="#FFFFFF"/>
                        <Trigger.EnterActions>
                            <ctrls:ButtonSoundPlayerAction SoundFile="buttonclick.wav"/>
                        </Trigger.EnterActions>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
4

2 に答える 2

1
  • 何が遅いかを確認してください。本当。データベースがリストを埋めているような場合、質問は完全にオフです(パフォーマンスはWPFではないため)。

  • リストの大きさは?すぐに表示される 5000 個の要素のリストがあります。私の4.0仮想リストはリストにあるものだけをレンダリングするため、ほとんどです。リストを埋めている間、あなたはデータバインドされていませんか?

  • 最後に、レンダリングが遅いのは何ですか? wpf プロファイラーを使用して見つけてお知らせください。

于 2010-12-20T16:11:44.570 に答える
0

リスト (またはリストが含まれるウィンドウ全体) を初期状態でいつでも折りたたむように設定し、データ取得スレッドから完了したという言葉が返ってきたら折りたたみを解除することができます。

私は他のいくつかのプログラムでそれを行いましたが、かなりうまく機能します。

  1. ユーザーがプログラムを実行すると、スプラッシュ スクリーンが表示され、メイン ウィンドウの読み込みが折りたたまれます。
  2. データ取得スレッドが実行され、データが取得され、終了したことが報告されます。
  3. スプラッシュ スクリーンが消え、メイン ウィンドウが表示され、リストが表示されます。
于 2010-12-20T16:11:19.763 に答える