Windows商店应用:我使用全局变量和扩展启动画面是否正确?

时间:2013-04-16 08:27:41

标签: c# windows-8 microsoft-metro windows-store-apps winrt-xaml

我正在创建一个包含许多webservice调用的应用程序,为了使流程更好并且可能通过windows存储有关启动时间的要求,我决定使用扩展启动画面来加载所有主要数据然后共享此数据使用我在App.xaml.cs中定义的全局变量来跨越不同的页面。

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

以下是我的代码

这里是app.xaml.cs页面中的一些代码:这里我定义全局变量,在进入extende初始屏幕之前从我的webservice加载应用程序的背景图像

   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:这里我在进入主页之前从网络服务加载应用程序的一些初始化数据。数据将保存到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 个答案:

答案 0 :(得分:1)

这不是您确切问题的答案,但是Build 2012中有一个关于启动响应和XAML性能的精彩视频可能会触及您的要求。他确实谈过如何处理有很多初创家务的应用程序。

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