0

我创建了一个包含许多 web 服务调用的应用程序,为了使流程更好,并可能通过 windows 商店关于启动时间的要求,我决定使用扩展启动屏幕来加载所有主要数据,然后跨不同共享这些数据使用我在 App.xaml.cs 中定义的全局变量的页面。

我的问题是:以这种方式使用全局变量是否正确,当应用程序暂停/恢复时是否存在丢失这些数据的风险?,因为我只是从扩展的初始屏幕初始化这些数据。

下面是我的代码

这是 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:在 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
          ------------------
         ------------------
         ------------------
          ------------------
         ------------------
         ------------------
         ------------------

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

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



    }
4

1 回答 1

1

这并不是您确切问题的真正答案,但 Build 2012 中有一个很棒的视频,关于启动响应能力和 XAML 性能,可能会触及您所要求的内容。他确实谈到了如何处理有很多启动琐事的应用程序。

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

于 2013-04-17T03:53:42.777 回答