2013-04-16 16 views
0

我创建一个应用程序与许多webservice调用,并为了使流程更好,并可能通过windows store有关启动时间的要求,我决定使用扩展启动画面来加载所有的主要数据,然后共享这些数据crossross不同的页面使用我在App.xaml.cs中定义的全局变量。Windows商店应用程序:我使用全局变量和扩展启动画面是否正确?

我的问题是:以这种方式使用全局变量是否正确,并且当应用程序被暂停/恢复时,这些数据会丢失,因为我只是从扩展的启动画面初始化这些数据那。

下面是我的代码

这里距离app.xaml.cs页一些代码:这里我定义全局变量,从我的web应用程序加载背景图片之前,我去了延长器闪屏

sealed partial class App : Application 
     { 

      **public string[] NavigateData { get; set; } 
      public NavigationCacheMode NavigationCacheMode { get; set; }** 



      public App() 
      { 
       this.InitializeComponent(); 
       this.Suspending += OnSuspending; 

       //Cache the page  
       this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled; 
      } 


      protected async override void OnLaunched(LaunchActivatedEventArgs args) 
      { 
       Frame rootFrame = Window.Current.Content as Frame; 
       //---------------------------------Live tile 
       var uris = new List<Uri> 
       { 
        new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetFirstTile"), 

        new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetSecondTile"), 
        new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetStatisticTile"), 
        new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetNewsTile1"), 
        new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetNewsTile2"), 

       }; 

       TileUpdater LiveTileUpdater = TileUpdateManager.CreateTileUpdaterForApplication();   
       LiveTileUpdater.EnableNotificationQueue(true); // Enable notifications 
       LiveTileUpdater.Clear(); // Clear the current set of updates 
       LiveTileUpdater.StartPeriodicUpdateBatch(uris, PeriodicUpdateRecurrence.HalfHour); 
       //------------------------------Live tile section end 


       // Do not repeat app initialization when the Window already has content, 
       // just ensure that the window is active 
       if (rootFrame == null) 
       { 
        // Create a Frame to act as the navigation context and navigate to the first page 
        rootFrame = new Frame(); 
        weather.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame"); 


     //When the app is loaded first time it calls the web service to get wich background picture to use 
      //--------------------------Getting and setting background image for all the pages-------------------- 
        string appBackgGround; 
     ServiceReference.WebServiceSoapClient webServiceObj = new ServiceReference.WebServiceSoapClient(); 
        // Get the name of the Background picture 
     appBackgGround = await webServiceObj.GetBackgroundImageAsync(); 


        // Her we set the application background Image for all pages "backgroundImageBlueSky.jpg" 
        rootFrame.Background = new ImageBrush 
        { 
         Stretch = Windows.UI.Xaml.Media.Stretch.UniformToFill, 
         ImageSource = new BitmapImage { UriSource = new Uri("ms-appx:///Assets/"+appBackgGround) } 

        }; 
     //--------------------------Bacground image end-------------------- 



        if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) 
        { 
         //TODO: Load state from previously suspended application 
         await weather.Common.SuspensionManager.RestoreAsync(); 
        } 

        // Place the frame in the current Window 
        Window.Current.Content = rootFrame; 
       } 

       if (rootFrame.Content == null) 
       { 
        // When the navigation stack isn't restored navigate to the first page, 
        // configuring the new page by passing required information as a navigation 
        // parameter 
        //Go to the extended splash screen 
        if (!rootFrame.Navigate(typeof(ExtendedSplashScreen), rootFrame.GetNavigationState())) 
        { 
         throw new Exception("Failed to create initial page"); 
        } 


       } 
       // Ensure the current window is active 
       //create the about page 
       var _Helper = new Flyouts.SettingsHelper(); 
       _Helper.AddCommand<Flyouts.About>("About"); 
       Window.Current.Activate(); 
      } 


      private async void OnSuspending(object sender, SuspendingEventArgs e) 
      { 
       var deferral = e.SuspendingOperation.GetDeferral(); 
       //TODO: Save application state and stop any background activity 
       await weather.Common.SuspensionManager.SaveAsync(); 
       deferral.Complete(); 
      } 


     } 
    } 

ExtendedSplashScreen:在这里,我从web服务加载应用程序的一些初始化数据之前,我去到网主页。数据保存到App.xaml.cs中定义的全局变量中。在加载此数据时,会显示进度环。数据装入后,我移动到炫魅

public sealed partial class ExtendedSplashScreen : Page 
{ 

    parameterItem max1DayAgo = new parameterItem(); 
    parameterItem min1DayAgo = new parameterItem(); 


    public ExtendedSplashScreen() 
    { 
     this.InitializeComponent(); 
    } 

    protected override async void OnNavigatedTo(NavigationEventArgs e) 
    { 

     string[] periodSelector  = { "1DayAgo", "1WeekAgo", "1MonthAgo" }; 
     string[] modeSelector  = { "max", "min" }; 
     string[] parameterSelector = { "umtTemp1", "umtWindSpeed", "umtAdjBaromPress", "umtRainRate" }; 

     //---------------GETTING WEBSERVICE DATA FOR STARTUP------------- 
     //Create a webservice object 
     ServiceReference.WebServiceSoapClient webServiceObj = new ServiceReference.WebServiceSoapClient();  
     var getMax1DayAgoObj = await webServiceObj.GetSelectedMaxMinDataAsync(parameterSelector, periodSelector[0], modeSelector[0]); 

     //create an object that holds min data for yesterday 

     var getMin1DayAgoObj = await webServiceObj.GetSelectedMaxMinDataAsync(parameterSelector, periodSelector[0], modeSelector[1]); 
     //Save arrayOfValue and arrayOfUnit to a parameterItem object. these objects are created during startup 
     // and the can be accessed and updated by all methods in this page later we will see that maxMinButton_Click method 
     //for the maxMinButton will use these data 
     max1DayAgo.arrayOfValue = getMax1DayAgoObj.arrayOfValue; 
     max1DayAgo.arrayOfUnit = getMax1DayAgoObj.arrayOfUnit; 

     min1DayAgo.arrayOfValue = getMin1DayAgoObj.arrayOfValue; 
     min1DayAgo.arrayOfUnit = getMin1DayAgoObj.arrayOfUnit; 

     string[] startupData = new string[13]; 

     startupData[0] = " " + max1DayAgo.arrayOfValue[0] + " " + max1DayAgo.arrayOfUnit[0]; // maxTemp 
     startupData[1] = " " + max1DayAgo.arrayOfValue[1] + " " + max1DayAgo.arrayOfUnit[1]; // maxWindSped 
     startupData[2] = " " + max1DayAgo.arrayOfValue[2] + " " + max1DayAgo.arrayOfUnit[2]; // maxAirPressure 
     startupData[3] = " " + max1DayAgo.arrayOfValue[3] + " " + max1DayAgo.arrayOfUnit[3];//  maxRainfall 

     startupData[4] = " " + min1DayAgo.arrayOfValue[0] + " " + min1DayAgo.arrayOfUnit[0]; // minTemp 
     startupData[5] = " " + min1DayAgo.arrayOfValue[1] + " " + min1DayAgo.arrayOfUnit[1];//  minWindSped 
     startupData[6] = " " + min1DayAgo.arrayOfValue[2] + " " + min1DayAgo.arrayOfUnit[2];//  minAirPressure 
     startupData[7] = " " + min1DayAgo.arrayOfValue[3] + " " + min1DayAgo.arrayOfUnit[3];//  minRainfall 
     // Main fields 

     var getLatestTempObj  = await webServiceObj.GetLatestDataAsync("umtTemp1"); 
     var getLatestWindObj  = await webServiceObj.GetLatestDataAsync("umtWindSpeed"); 
     var getLatestwindDirObj  = await webServiceObj.GetLatestDataAsync("umtAdjWinDir"); 
     var getLatestairPressureObj = await webServiceObj.GetLatestDataAsync("umtAdjBaromPress"); 

     startupData[8] = " " + getLatestTempObj.Value + " " + getLatestTempObj.Unit;//temperatureMainTxtBlock.Text 
     startupData[9] = " " + getLatestWindObj.Value + " " + getLatestWindObj.Unit;//temperatureMainTxtBlock.Text 
     startupData[10] = "" + getLatestwindDirObj.Value; //temperatureMainTxtBlock.Text 
     startupData[11] = " " + getLatestairPressureObj.Value + " " + getLatestairPressureObj.Unit;//temperatureMainTxtBlock.Text 
     startupData[12] = "Last update: " + getLatestwindDirObj.Timestamp;//temperatureMainTxtBlock.Text 
     **//pass the webservice data to the global variable 
     (App.Current as App).NavigateData = startupData;** 

     //since im using extendes splash screen i reset the navigation history so the user cannot go back to the extended splash screen  
     this.Frame.SetNavigationState(e.Parameter as string); 
     //Go to mainpage 
     this.Frame.Navigate(typeof(MainPage)); 
    } 
} 

的MainPage:在网主页我显示由在文本框扩展初始屏幕加载的全局数据。

public sealed partial class MainPage : weather.Common.LayoutAwarePage 
    { 
     //Defining objects use through this page 
     maxMinSelector maxMinButtonSelector = new maxMinSelector(); 

     parameterItem max1DayAgo = new parameterItem(); 
     parameterItem min1DayAgo = new parameterItem(); 

     parameterItem max1WeekAgo = new parameterItem(); 
     parameterItem min1WeekAgo = new parameterItem(); 

     parameterItem max1MonthAgo = new parameterItem(); 
     parameterItem min1MonthAgo = new parameterItem(); 

     EasingDoubleKeyFrame keyFrame = new EasingDoubleKeyFrame(); 

     public MainPage() 
     { 
      this.InitializeComponent(); 
      Loaded += MainPage_Loaded; 


      Code 
     ------------------ 
     ------------------ 
     ------------------ 
     ------------------ 
      //Cache the page  
      this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled; 
     } 


     void MainPage_Loaded(object sender, RoutedEventArgs e) 
     { 
      Code 
      ------------------ 
     ------------------ 
     ------------------ 
     ------------------ 
     } 

     protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 

      // HERE i use the global data initialised in the extended splash screen 
      base.OnNavigatedTo(e); 
      maxTempTextblock.Text = (App.Current as App).NavigateData[0]; 
      maxWindSpedTextBlock.Text = (App.Current as App).NavigateData[1]; 
      maxAirPressureTextBlock.Text = (App.Current as App).NavigateData[2]; 
      maxRainfallTextBlock.Text = (App.Current as App).NavigateData[3]; 

      minTempTextblock.Text = (App.Current as App).NavigateData[4]; 
      minWindSpedTextBlock.Text = (App.Current as App).NavigateData[5]; 
      minAirPressureTextBlock.Text = (App.Current as App).NavigateData[6]; 
      minRainfallTextBlock.Text = (App.Current as App).NavigateData[7]; 


      temperatureMainTxtBlock.Text = (App.Current as App).NavigateData[8]; 
      WindSpeedTxtBlockLower.Text = (App.Current as App).NavigateData[9]; 
      WindDirectionTxtBlockLower.Text = (App.Current as App).NavigateData[10]; 
      airPressureTxtBlockLower.Text = (App.Current as App).NavigateData[11]; 
      LastUpdateTextField.Text = (App.Current as App).NavigateData[12]; 


     } 

     Code 
      ------------------ 
     ------------------ 
     ------------------ 
      ------------------ 
     ------------------ 
     ------------------ 
     ------------------ 

      ------------------ 
     ------------------ 
     ------------------ 
     ------------------ 

     ------------------ 



    } 

回答

1

这不是真正的答案,你的确切问题,但没有从建造约2012启动响应速度和性能XAML可能触及你问了一下一个伟大的视频。他的确谈到了如何处理有很多启动任务的应用程序。

http://channel9.msdn.com/Events/Build/2012/4-103

相关问题