WPF предварительно отображает список без его фактического отображения - PullRequest
3 голосов
/ 20 декабря 2010

Есть ли способ «предварительно визуализировать» список в 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>

Ответы [ 2 ]

1 голос
/ 20 декабря 2010
  • Проверьте, ЧТО медленно. В самом деле. Если это как БД, заполняющая список, ваш вопрос полностью снят (поскольку производительность не соответствует действительности WPF).

  • Насколько велик список? У меня есть список из 5000 элементов рендеринга в мгновение ока. Большинство, потому что мой виртуальный список 4.0 отображает только то, что находится в списке. Вы не привязаны к данным при заполнении списка, или?

  • Наконец, что медленно в рендеринге? Воспользуйтесь профилировщиком wpf, чтобы узнать и сообщить нам, потому что в один прекрасный день вы можете просто попытаться оптимизировать не то.

0 голосов
/ 20 декабря 2010

Вы всегда можете установить, чтобы список (или все окно, в котором содержится этот список) свернулся в своем первоначальном состоянии, а затем разархивировал его, когда вы получаете сообщение из потока поиска данных о том, что оно сделано. *

Я сделал это с парой других моих программ, и это работает довольно хорошо.

  1. Пользователь запускает программу, отображается заставка, а главное окно загружается.
  2. Выполняется поток извлечения данных, получает данные, сообщает о завершении.
  3. Экран-заставка исчезает, отображается главное окно и заполняется список.

Cory

...