WPF预呈现一个没有实际显示它的列表

时间:2010-12-20 16:02:20

标签: wpf list prerender

有没有办法在WPF中“预呈现”列表而不实际向用户显示?我有一个列表,它第一次显示给用户时渲染速度相当慢(几秒钟)。

我想预先渲染/预先绘制列表,以便向用户显示列表所需的几秒钟不明显。我希望在应用程序启动时发生这种情况 - 同时显示我的启动画面。

实现这一目标的最佳方法是什么?

编辑:

这是我的列表项样式。如您所见,目标类型是Button。该按钮还有一个RoutedEvent(Command)设置。

<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>

2 个答案:

答案 0 :(得分:1)

  • 检查什么是慢的。真。这就像数据库填满了列表一样,你的问题完全没了(因为没有WPF实现)。

  • 列表有多大?我有一个5000个元素的列表在瞬间通知。 Mosty因为我的4.0虚拟列表只呈现列表中的内容。填写列表时,您不是数据绑定,或?

  • 最后,什么是慢的?使用wpf探查器找出并告诉我们 - 因为在当天你可能只是尝试优化错误的东西。

答案 1 :(得分:0)

您总是可以将列表(或列表所包含的整个窗口)设置为在其初始状态下折叠,然后在从数据检索线程中获取完成后再解除它。

我已经使用其他几个程序完成了这项工作,但效果非常好。

  1. 用户执行程序,启动画面显示,主窗口加载折叠。
  2. 数据检索线程执行,获取数据,报告完成。
  3. 启动画面消失,显示主窗口并填充列表。
  4. 科里