我创建了一个包含许多 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
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
}