0

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

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

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

4

2 回答 2

0

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

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

于 2012-10-15T17:27:51.037 回答
0

如果您将 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 中(应该无处不在)。

于 2012-10-15T18:20:11.273 回答