2

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

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

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

编辑:

这是我的列表项样式。如您所见,目标类型是按钮。该按钮上还设置了一个 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>
4

2 回答 2

1
  • 检查什么是慢的。真的。如果它就像数据库填满了列表,那么你的问题就完全没有了(因为性能不是 WPF 的)。

  • 清单有多大?我有一个立即渲染的 5000 个元素的列表。大多数是因为我的 4.0 虚拟列表只呈现列表中的内容。填写列表时您没有数据绑定,或者?

  • 最后,什么是rdering慢?使用 wpf 分析器找出并告诉我们 - 因为在一天结束时,您可能只是尝试优化错误的东西。

于 2010-12-20T16:11:44.570 回答
0

您始终可以将列表(或包含列表的整个窗口)设置为在其初始状态下折叠,然后在您从数据检索线程返回完成的消息时取消折叠它。

我已经用我的其他几个程序做到了这一点,而且效果很好。

  1. 用户执行程序,闪屏显示,主窗口加载折叠。
  2. 数据检索线程执行,获取数据,报告完成。
  3. 启动画面消失,显示主窗口并填充列表。
于 2010-12-20T16:11:19.763 回答