最小化XAML应用程序启动时间

时间:2012-10-14 18:30:11

标签: c# xaml windows-8 windows-runtime winrt-xaml

Microsoft的文章(http://msdn.microsoft.com/en-us/library/windows/apps/hh994639.aspx)声明您可以创建扩展的启动画面页面,在此期间您可以创建MainPage,然后在加载后导航到它。

唯一的问题是页面的Loaded事件在页面到Window.Current.Content属性之前永远不会触发。

有人有解决方案吗? - 我的MainPage有相当大量的XAML,需要一段时间才能加载到低端设备上。

2 个答案:

答案 0 :(得分:0)

默认情况下,应用程序的可视根有一个Frame控件。您可以修改它,例如将自己的UserControl放在那里(我通常称之为AppShell),其中包含所有页面使用的Frame,您可以拥有弹出窗口,登录屏幕等图层或扩展的启动画面。

要解决您的问题 - 只需将Frame和扩展的splash控件放在Grid中,然后只在加载扩展的splash控件后导航到第一页。其他一切都应该很简单。

答案 1 :(得分:0)

如果您使用MainPage类似于ASP.NET中的MasterPage,您的MainPage应该具有APP Bar定义,并且只应在Body中包含单帧元素。 使用此模式设置应用程序的内容而不是

Window.Current.Content = // An Application Page 
use
AppFrame.Content = //An Application Page

还要考虑从MainPage元素中删除Mainpage代码并将其放在自定义用户控件中,然后您可以从userControl冒泡一个事件,以便MainPage处理。它还允许您在应用程序的其他位置使用该功能,而无需完全重新创建逻辑和UI。

以下是MainPage的示例XAML:

>

<Page.Resources>
    <ResourceDictionary x:Name="CommonStyles" Source="/Common/StandardStyles.xaml" />
</Page.Resources>
<Page.TopAppBar>
    <AppBar x:Name="NavigationAppBar" Padding="10,0,10,0" AutomationProperties.Name="Global App Bar" >
        <Grid>                
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <StackPanel x:Name="LeftCommands" Orientation="Horizontal" Grid.Column="0" HorizontalAlignment="Left">
            <!-- App Bar Buttons Removed --> 
            </StackPanel>
        </Grid>
    </AppBar>
</Page.TopAppBar>

<!--
    This grid acts as a root panel for the page that defines two rows:
    * Row 0 contains the back button and page title
    * Row 1 contains the rest of the page layout
-->

                                                                                       
         

将类型框架的公共属性添加到具有Getter和Setter的应用程序视图模型

public Frame SelectedAppFrame {get;set;}
MainPage.xaml.cs文件中的

分配属性:

ApplicationViewModel vm = this.PageBackgroundGrid.DataContext as ApplicationViewModel;
vm.SelectedAppFrame = this.AppFrame;

和应用程序视图模型中的通用导航代码是:

public void HandleNavigaitionEvent(object sender, string pageName, Frame AppFrame, StackPanel stack)
        {
            var content = Pages.Where(i => i.Name == pageName).FirstOrDefault();
            NavigateTrigger(AppFrame, content);
        }

public void NavigateTrigger(Frame AppFrame, LayoutAwarePage content)
        {
            EventAggregator.GetEvent<PageNavigatedEvent>().Publish(content);
            AppFrame.Content = content;
            NaviagationPath.Add(content);
        }

通过这种方式,您可以从应用程序的任何位置将更改提升到AppFram中,可以访问ApplicationViewModel(应该无处不在)。