是否可以在Windows Phone 7中预加载程序集?

时间:2012-04-25 11:46:17

标签: windows-phone-7

我有一个应用程序,其中有很多引用,加载时间对我来说是不可接受的。我已经删除了启动画面图像,并通过一个单独的项目创建了一个动画加载屏幕,该项目没有引用主应用程序,然后导航到应用程序其余部分的第一页。它确实现在开始很快,但它仍然有点缺乏。

我想在加载屏幕消失之前再做一个动画。我能想到的唯一方法是实际将导航所需的程序集预加载到下一页,做一个动画,然后导航。

我试过了

  • OnNavigatedFrom但是动画没有时间运行,因为从那一点起页面将很快被新页面替换。
  • OnNavigatingFrom没有任何帮助,因为我打电话给NavigationService.Navigate();
  • 搜索网页和Stack Overflow :)
  • 我还考虑通过让下一页显示加载屏幕的副本并在那里做最后一个动画来伪装它,但它无法匹配加载屏幕动画的当前状态并且更难维护

感谢您的任何想法!

2 个答案:

答案 0 :(得分:0)

如果要强制加载装配体,只需引用此装配体中的类型。

例如,类似Console.WriteLine(typeof(YourAssembly.SomeType));的内容会强制加载YourAssembly

现在您的问题,也许您可​​以使用usercontrols?将主页的内容放在用户控件中。显示加载页面,在后台创建用户控件,让动画播放,然后在动画播放时用usercontrol替换页面内容。

答案 1 :(得分:0)

事实证明,只需创建要导航到的页面的新实例即可预加载。不幸的是,这必须在UI线程上完成,这可能导致动画减速,至少在我的经验中。

以下是如何进行动画,然后预加载,然后在导航前再做一个动画的示例。 :

public partial class LoadScreen : PhoneApplicationPage
{
    public LoadScreen()
    {
        InitializeComponent();
        this.Loaded += OnLoaded;
    }

    private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
    {
        var sb = new Storyboard();
        // create your animation here

        sb.Completed += (sender, args) => PreLoad();
        sb.Begin();
    }

    private void PreLoad()
    {
        // this is the part that actually takes time and causes things to get loaded
        // you may need it in a try/catch block depending on what is in your constructor
        var page = new PageToNavigateTo();

        // now create an animation at the end of which we navigate away
        var sbOut = new Storyboard();
        // create your animation here

        sbOut.Completed += (sender, args) => NavigateToNextScreen();
        sbOut.Begin();
    }

    private void NavigateToNextScreen()
    {
        // navigate here
    }

    protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);

        // remove the loading screen from the backstack so the user doesn't see it again when hitting the back button
        NavigationService.RemoveBackEntry();
    }


}