【问题标题】:Minimizing XAML App Startup Times最小化 XAML 应用程序启动时间
【发布时间】:2014-07-15 17:01:13
【问题描述】:

Microsoft 的文章 (http://msdn.microsoft.com/en-us/library/windows/apps/hh994639.aspx) 指出,您可以创建一个扩展的初始屏幕页面,在此期间您可以创建 MainPage,然后在加载后导航到它。

唯一的问题是页面的Loaded事件永远不会触发,直到页面指向Window.Current.Content属性。

有人对此有解决方案吗? - 我的 MainPage 有相当多的 XAML,在低端设备上加载需要一段时间。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 听起来是个好主意,但我还没有实现它(还)。问题是由于 OnNavigatedTo 事件中的 await / async 运算符造成的——由于某种原因,这些运算符的处理方式存在问题。我通过运行一个新任务来修复它 - 启动一个新线程也可以:)
    【解决方案2】:

    如果您将 MainPage 与 ASP.NET 中的 MasterPage 类似地使用,您的 MainPage 应该具有 APP Bar 定义,并且在正文中应该只包含一个单帧元素。 使用这种模式来设置应用程序的内容,而不是

    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 将 Frame 类型的公共属性添加到应用程序视图模型

    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);
            }
    

    这样,您可以将更改从应用程序中可访问 ApplicationViewModel 的任何位置传播到 AppFram(应该无处不在)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多