From f9c1a5a35a2c9e94ba64e2967be5cbcfdd5d7026 Mon Sep 17 00:00:00 2001 From: Gustavo Martin Date: Mon, 19 May 2014 07:43:57 +0200 Subject: [PATCH] WindowsPhone: WeatherInformation --- .../WeatherInformation/WeatherInformation.sln | 40 ++++ .../WeatherInformation/WeatherInformation/App.xaml | 20 ++ .../WeatherInformation/App.xaml.cs | 247 +++++++++++++++++++++ .../WeatherInformation/Assets/AlignmentGrid.png | Bin 0 -> 9042 bytes .../WeatherInformation/Assets/ApplicationIcon.png | Bin 0 -> 3392 bytes .../Assets/Tiles/FlipCycleTileLarge.png | Bin 0 -> 9930 bytes .../Assets/Tiles/FlipCycleTileMedium.png | Bin 0 -> 9070 bytes .../Assets/Tiles/FlipCycleTileSmall.png | Bin 0 -> 3674 bytes .../Assets/Tiles/IconicTileMediumLarge.png | Bin 0 -> 4937 bytes .../Assets/Tiles/IconicTileSmall.png | Bin 0 -> 3724 bytes .../WeatherInformation/Images/add.png | Bin 0 -> 339 bytes .../WeatherInformation/Images/feature.settings.png | Bin 0 -> 825 bytes .../WeatherInformation/LocalizedStrings.cs | 14 ++ .../WeatherInformation/MainPage.xaml | 104 +++++++++ .../WeatherInformation/MainPage.xaml.cs | 68 ++++++ .../WeatherInformation/MapPage.xaml | 36 +++ .../WeatherInformation/MapPage.xaml.cs | 134 +++++++++++ .../Model/CurrentWeatherParser/Clouds.cs | 10 + .../Model/CurrentWeatherParser/Coord.cs | 11 + .../Model/CurrentWeatherParser/CurrentWeather.cs | 22 ++ .../Model/CurrentWeatherParser/Main.cs | 14 ++ .../Model/CurrentWeatherParser/Rain.cs | 20 ++ .../Model/CurrentWeatherParser/Sys.cs | 13 ++ .../Model/CurrentWeatherParser/Weather.cs | 13 ++ .../Model/CurrentWeatherParser/Wind.cs | 11 + .../Model/ForecastWeatherParser/City.cs | 14 ++ .../Model/ForecastWeatherParser/Coord.cs | 11 + .../Model/ForecastWeatherParser/ForecastWeather.cs | 15 ++ .../Model/ForecastWeatherParser/List.cs | 19 ++ .../Model/ForecastWeatherParser/Temp.cs | 15 ++ .../Model/ForecastWeatherParser/Weather.cs | 13 ++ .../Model/JsonDataParser/JsonParser.cs | 28 +++ .../Model/Services/ServiceParser.cs | 31 +++ .../WeatherInformation/Properties/AppManifest.xml | 4 + .../WeatherInformation/Properties/AssemblyInfo.cs | 37 +++ .../Properties/WMAppManifest.xml | 47 ++++ .../Resources/AppResources.Designer.cs | 138 ++++++++++++ .../WeatherInformation/Resources/AppResources.resx | 140 ++++++++++++ .../SampleData/MainViewModelSampleData.xaml | 25 +++ .../WeatherInformation/ViewModels/ItemViewModel.cs | 130 +++++++++++ .../WeatherInformation/ViewModels/MainViewModel.cs | 127 +++++++++++ .../WeatherInformation/WeatherInformation.csproj | 197 ++++++++++++++++ .../WeatherInformation/packages.config | 4 + 43 files changed, 1772 insertions(+) create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation.sln create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/App.xaml create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/App.xaml.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Assets/AlignmentGrid.png create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Assets/ApplicationIcon.png create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Assets/Tiles/FlipCycleTileLarge.png create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Assets/Tiles/FlipCycleTileMedium.png create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Assets/Tiles/FlipCycleTileSmall.png create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Assets/Tiles/IconicTileMediumLarge.png create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Assets/Tiles/IconicTileSmall.png create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Images/add.png create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Images/feature.settings.png create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/LocalizedStrings.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/MainPage.xaml create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/MainPage.xaml.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/MapPage.xaml create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/MapPage.xaml.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Clouds.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Coord.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/CurrentWeather.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Main.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Rain.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Sys.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Weather.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Wind.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/City.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Coord.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/ForecastWeather.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/List.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Temp.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Weather.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/JsonDataParser/JsonParser.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Model/Services/ServiceParser.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Properties/AppManifest.xml create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Properties/AssemblyInfo.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Properties/WMAppManifest.xml create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Resources/AppResources.Designer.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/Resources/AppResources.resx create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/SampleData/MainViewModelSampleData.xaml create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/ViewModels/ItemViewModel.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/ViewModels/MainViewModel.cs create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/WeatherInformation.csproj create mode 100644 WindowsPhone/WeatherInformation/WeatherInformation/packages.config diff --git a/WindowsPhone/WeatherInformation/WeatherInformation.sln b/WindowsPhone/WeatherInformation/WeatherInformation.sln new file mode 100644 index 0000000..54c1b02 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation.sln @@ -0,0 +1,40 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30110.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WeatherInformation", "WeatherInformation\WeatherInformation.csproj", "{71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Debug|ARM.ActiveCfg = Debug|ARM + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Debug|ARM.Build.0 = Debug|ARM + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Debug|ARM.Deploy.0 = Debug|ARM + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Debug|x86.ActiveCfg = Debug|x86 + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Debug|x86.Build.0 = Debug|x86 + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Debug|x86.Deploy.0 = Debug|x86 + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Release|Any CPU.Build.0 = Release|Any CPU + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Release|Any CPU.Deploy.0 = Release|Any CPU + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Release|ARM.ActiveCfg = Release|ARM + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Release|ARM.Build.0 = Release|ARM + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Release|ARM.Deploy.0 = Release|ARM + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Release|x86.ActiveCfg = Release|x86 + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Release|x86.Build.0 = Release|x86 + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7}.Release|x86.Deploy.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/App.xaml b/WindowsPhone/WeatherInformation/WeatherInformation/App.xaml new file mode 100644 index 0000000..895af5e --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/App.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/App.xaml.cs b/WindowsPhone/WeatherInformation/WeatherInformation/App.xaml.cs new file mode 100644 index 0000000..fcf2361 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/App.xaml.cs @@ -0,0 +1,247 @@ +using System; +using System.Diagnostics; +using System.Resources; +using System.Windows; +using System.Windows.Markup; +using System.Windows.Navigation; +using Microsoft.Phone.Controls; +using Microsoft.Phone.Shell; +using WeatherInformation.Resources; +using WeatherInformation.ViewModels; + +namespace WeatherInformation +{ + public partial class App : Application + { + private static MainViewModel viewModel = null; + + /// + /// ViewModel estático que usan las vistas con el que se van a enlazar. + /// + /// Objeto MainViewModel. + public static MainViewModel ViewModel + { + get + { + // Retrasar la creación del modelo de vista hasta que sea necesario + if (viewModel == null) + viewModel = new MainViewModel(); + + return viewModel; + } + } + + /// + /// Proporcionar acceso sencillo al marco raíz de la aplicación telefónica. + /// + /// Marco raíz de la aplicación telefónica. + public static PhoneApplicationFrame RootFrame { get; private set; } + + /// + /// Constructor para el objeto Application. + /// + public App() + { + // Controlador global para excepciones no detectadas. + UnhandledException += Application_UnhandledException; + + // Inicialización XAML estándar + InitializeComponent(); + + // Inicialización especifica del teléfono + InitializePhoneApplication(); + + // Inicialización del idioma + InitializeLanguage(); + + // Mostrar información de generación de perfiles gráfica durante la depuración. + if (Debugger.IsAttached) + { + // Mostrar los contadores de velocidad de marcos actual + Application.Current.Host.Settings.EnableFrameRateCounter = true; + + // Mostrar las áreas de la aplicación que se están volviendo a dibujar en cada marco. + //Application.Current.Host.Settings.EnableRedrawRegions = true; + + // Habilitar el modo de visualización de análisis de no producción, + // que muestra áreas de una página que se entregan a la GPU con una superposición coloreada. + //Application.Current.Host.Settings.EnableCacheVisualization = true; + + // Impedir que la pantalla se apague mientras se realiza la depuración deshabilitando + // la detección de inactividad de la aplicación. + // Precaución: solo debe usarse en modo de depuración. Las aplicaciones que deshabiliten la detección de inactividad del usuario seguirán en ejecución + // y consumirán energía de la batería cuando el usuario no esté usando el teléfono. + PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; + } + } + + // Código para ejecutar cuando la aplicación se inicia (p.ej. a partir de Inicio) + // Este código no se ejecutará cuando la aplicación se reactive + private void Application_Launching(object sender, LaunchingEventArgs e) + { + } + + // Código para ejecutar cuando la aplicación se activa (se trae a primer plano) + // Este código no se ejecutará cuando la aplicación se inicie por primera vez + private void Application_Activated(object sender, ActivatedEventArgs e) + { + // Asegurarse de que el estado de la aplicación se restaura adecuadamente + if (!App.ViewModel.IsDataLoaded) + { + App.ViewModel.LoadData(); + } + } + + // Código para ejecutar cuando la aplicación se desactiva (se envía a segundo plano) + // Este código no se ejecutará cuando la aplicación se cierre + private void Application_Deactivated(object sender, DeactivatedEventArgs e) + { + } + + // Código para ejecutar cuando la aplicación se cierra (p.ej., al hacer clic en Atrás) + // Este código no se ejecutará cuando la aplicación se desactive + private void Application_Closing(object sender, ClosingEventArgs e) + { + // Asegurarse de que el estado de la aplicación requerida persiste aquí. + } + + // Código para ejecutar si hay un error de navegación + private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) + { + if (Debugger.IsAttached) + { + // Ha habido un error de navegación; interrumpir el depurador + Debugger.Break(); + } + } + + // Código para ejecutar en excepciones no controladas + private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) + { + if (Debugger.IsAttached) + { + // Se ha producido una excepción no controlada; interrumpir el depurador + Debugger.Break(); + } + } + + #region Inicialización de la aplicación telefónica + + // Evitar inicialización doble + private bool phoneApplicationInitialized = false; + + // No agregar ningún código adicional a este método + private void InitializePhoneApplication() + { + if (phoneApplicationInitialized) + return; + + // Crear el marco pero no establecerlo como RootVisual todavía; esto permite que + // la pantalla de presentación permanezca activa hasta que la aplicación esté lista para la presentación. + RootFrame = new PhoneApplicationFrame(); + RootFrame.Navigated += CompleteInitializePhoneApplication; + + // Controlar errores de navegación + RootFrame.NavigationFailed += RootFrame_NavigationFailed; + + // Controlar solicitudes de restablecimiento para borrar la pila de retroceso + RootFrame.Navigated += CheckForResetNavigation; + + // Asegurarse de que no volvemos a inicializar + phoneApplicationInitialized = true; + } + + // No agregar ningún código adicional a este método + private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e) + { + // Establecer el objeto visual raíz para permitir que la aplicación se presente + if (RootVisual != RootFrame) + RootVisual = RootFrame; + + // Quitar este controlador porque ya no es necesario + RootFrame.Navigated -= CompleteInitializePhoneApplication; + } + + private void CheckForResetNavigation(object sender, NavigationEventArgs e) + { + // Si la aplicación ha recibido una navegación 'reset', tenemos que comprobarlo + // en la siguiente navegación para ver si se debe restablecer la pila de páginas + if (e.NavigationMode == NavigationMode.Reset) + RootFrame.Navigated += ClearBackStackAfterReset; + } + + private void ClearBackStackAfterReset(object sender, NavigationEventArgs e) + { + // Anular registro del evento para que no se vuelva a llamar + RootFrame.Navigated -= ClearBackStackAfterReset; + + // Borrar solo la pila de navegaciones 'new' (hacia delante) y 'refresh' + if (e.NavigationMode != NavigationMode.New && e.NavigationMode != NavigationMode.Refresh) + return; + + // Por coherencia de la IU, borrar toda la pila de páginas + while (RootFrame.RemoveBackEntry() != null) + { + ; // no hacer nada + } + } + + #endregion + + // Inicializar la fuente y la dirección de flujo de la aplicación según se define en sus cadenas de recursos traducidas. + // + // Para asegurarse de que la fuente de la aplicación está alineada con sus idiomas admitidos y que + // FlowDirection para todos esos idiomas sigue su dirección tradicional, ResourceLanguage + // y ResourceFlowDirection se debe inicializar en cada archivo resx para que estos valores coincidan con ese + // referencia cultural del archivo. Por ejemplo: + // + // AppResources.es-ES.resx + // El valor de ResourceLanguage debe ser "es-ES" + // El valor de ResourceFlowDirection debe ser "LeftToRight" + // + // AppResources.ar-SA.resx + // El valor de ResourceLanguage debe ser "ar-SA" + // El valor de ResourceFlowDirection debe ser "RightToLeft" + // + // Para obtener más información sobre cómo traducir aplicaciones para Windows Phone, consulta http://go.microsoft.com/fwlink/?LinkId=262072. + // + private void InitializeLanguage() + { + try + { + // Establecer la fuente para que coincida con el idioma definido por + // Cadena de recursos ResourceLanguage para cada idioma admitido. + // + // Recurrir a la fuente del idioma neutro si el idioma + // del teléfono no se admite. + // + // Si se produce un error del compilador, falta ResourceLanguage + // el archivo de recursos. + RootFrame.Language = XmlLanguage.GetLanguage(AppResources.ResourceLanguage); + + // Establecer FlowDirection de todos los elementos del marco raíz según + // en la cadena de recursos ResourceFlowDirection para cada + // idioma admitido. + // + // Si se produce un error del compilador, falta ResourceFlowDirection + // el archivo de recursos. + FlowDirection flow = (FlowDirection)Enum.Parse(typeof(FlowDirection), AppResources.ResourceFlowDirection); + RootFrame.FlowDirection = flow; + } + catch + { + // Si se detecta aquí una excepción, lo más probable es que se deba a + // ResourceLanguage no se ha establecido correctamente en un idioma admitido + // o ResourceFlowDirection se ha establecido en un valor distinto de LeftToRight + // o RightToLeft. + + if (Debugger.IsAttached) + { + Debugger.Break(); + } + + throw; + } + } + } +} \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Assets/AlignmentGrid.png b/WindowsPhone/WeatherInformation/WeatherInformation/Assets/AlignmentGrid.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d2e97804e451530960b57429a2b0a26c86f5d7 GIT binary patch literal 9042 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 IP1{HR1(GMkF8}}l literal 0 HcmV?d00001 diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Assets/Tiles/FlipCycleTileMedium.png b/WindowsPhone/WeatherInformation/WeatherInformation/Assets/Tiles/FlipCycleTileMedium.png new file mode 100644 index 0000000000000000000000000000000000000000..e93b89d600641c9d5b05f94493a9fde6afa850e8 GIT binary patch literal 9070 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 literal 0 HcmV?d00001 diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Assets/Tiles/IconicTileSmall.png b/WindowsPhone/WeatherInformation/WeatherInformation/Assets/Tiles/IconicTileSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b5ede1b567fd4b90505217330edf7de0474432 GIT binary patch literal 3724 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 literal 0 HcmV?d00001 diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Images/feature.settings.png b/WindowsPhone/WeatherInformation/WeatherInformation/Images/feature.settings.png new file mode 100644 index 0000000000000000000000000000000000000000..8efcfc2e78ceb5218653a4e07dd62097a3a9cec5 GIT binary patch literal 825 zcmV-91IGM`P)`%`DEDxg;Bt+~vZ%GdmgJa>+gH*X;#qnqEQV zat#Ck24DaNU;qXIFaQHE00S@xfB_hQ0T_S*7zDro%#GYMJz)?8omybiXBMz9-+_@u z3@*wg{{bkZ%ZT)muS)I<#-7OSPfmTjNv-(oMQWCrVeF9fNScs7xmsUWW7yQ-rZK6y zDl1#lcN@02i?Xm$nlCf{JtSS{j5(G;YkGY_(`mO#S;31UW7!BMYR>rQb($|UN;UeXk& z_LVx9uIyerhvq%7WQ)!Bl<>1ox?$Y)qgIUT?ky0XplFpVZM(=p + /// Proporciona acceso a los recursos de cadena. + /// + public class LocalizedStrings + { + private static AppResources _localizedResources = new AppResources(); + + public AppResources LocalizedResources { get { return _localizedResources; } } + } +} \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/MainPage.xaml b/WindowsPhone/WeatherInformation/WeatherInformation/MainPage.xaml new file mode 100644 index 0000000..8c1626b --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/MainPage.xaml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/MainPage.xaml.cs b/WindowsPhone/WeatherInformation/WeatherInformation/MainPage.xaml.cs new file mode 100644 index 0000000..d53481a --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/MainPage.xaml.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Navigation; +using Microsoft.Phone.Controls; +using Microsoft.Phone.Shell; +using WeatherInformation.Resources; + +namespace WeatherInformation +{ + public partial class MainPage : PhoneApplicationPage + { + // Constructor + public MainPage() + { + InitializeComponent(); + + // Establecer el contexto de datos del control ListBox control en los datos de ejemplo + DataContext = App.ViewModel; + + // Código de ejemplo para traducir ApplicationBar + //BuildLocalizedApplicationBar(); + } + + // Cargar datos para los elementos ViewModel + protected override void OnNavigatedTo(NavigationEventArgs e) + { + if (!App.ViewModel.IsDataLoaded) + { + App.ViewModel.LoadData(); + } + } + + private void LongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + + } + + private void Location_Click(object sender, EventArgs e) + { + NavigationService.Navigate(new Uri("/MapPage.xaml", UriKind.Relative)); + } + + private void Settings_Click(object sender, EventArgs e) + { + + } + + // Código de ejemplo para compilar una ApplicationBar traducida + //private void BuildLocalizedApplicationBar() + //{ + // // Establecer ApplicationBar de la página en una nueva instancia de ApplicationBar. + // ApplicationBar = new ApplicationBar(); + + // // Crear un nuevo botón y establecer el valor de texto en la cadena traducida de AppResources. + // ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/appbar.add.rest.png", UriKind.Relative)); + // appBarButton.Text = AppResources.AppBarButtonText; + // ApplicationBar.Buttons.Add(appBarButton); + + // // Crear un nuevo elemento de menú con la cadena traducida de AppResources. + // ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AppBarMenuItemText); + // ApplicationBar.MenuItems.Add(appBarMenuItem); + //} + } +} \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/MapPage.xaml b/WindowsPhone/WeatherInformation/WeatherInformation/MapPage.xaml new file mode 100644 index 0000000..c7d1ae2 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/MapPage.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/MapPage.xaml.cs b/WindowsPhone/WeatherInformation/WeatherInformation/MapPage.xaml.cs new file mode 100644 index 0000000..2862df7 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/MapPage.xaml.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Navigation; +using Microsoft.Phone.Controls; +using Microsoft.Phone.Shell; +using System.IO.IsolatedStorage; +using Windows.Devices.Geolocation; +using System.Device.Location; +using System.Windows.Shapes; +using System.Windows.Media; +using Microsoft.Phone.Maps.Controls; + +namespace WeatherInformation +{ + public partial class MapPage : PhoneApplicationPage + { + public MapPage() + { + InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + if (!IsolatedStorageSettings.ApplicationSettings.Contains("LocationConsent")) + { + MessageBoxResult result = + MessageBox.Show("This app accesses your phone's location. Is that ok?", + "Location", + MessageBoxButton.OKCancel); + + if (result == MessageBoxResult.OK) + { + IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = true; + } + else + { + IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = false; + } + + IsolatedStorageSettings.ApplicationSettings.Save(); + } + + bool locationConsentValue; + if (IsolatedStorageSettings.ApplicationSettings.TryGetValue("LocationConsent", out locationConsentValue)) + { + this.GetLocation(); + } + } + + private async void GetLocation() + { + + if ((bool)IsolatedStorageSettings.ApplicationSettings["LocationConsent"] != true) + { + // The user has opted out of Location. + return; + } + + Geolocator geolocator = new Geolocator(); + geolocator.DesiredAccuracyInMeters = 50; + + try + { + Geoposition geoposition = await geolocator.GetGeopositionAsync( + maximumAge: TimeSpan.FromMinutes(5), + timeout: TimeSpan.FromSeconds(10) + ); + GeoCoordinate myGeoCoordinate = CoordinateConverter.ConvertGeocoordinate(geoposition.Coordinate); + + // Create a small circle to mark the current location. + Ellipse myCircle = new Ellipse(); + myCircle.Fill = new SolidColorBrush(Colors.Blue); + myCircle.Height = 20; + myCircle.Width = 20; + myCircle.Opacity = 50; + + // Create a MapOverlay to contain the circle. + MapOverlay myLocationOverlay = new MapOverlay(); + myLocationOverlay.Content = myCircle; + myLocationOverlay.PositionOrigin = new Point(0.5, 0.5); + myLocationOverlay.GeoCoordinate = myGeoCoordinate; + + // Create a MapLayer to contain the MapOverlay. + MapLayer myLocationLayer = new MapLayer(); + myLocationLayer.Add(myLocationOverlay); + + this.mapWeatherInformation.Center = myGeoCoordinate; + this.mapWeatherInformation.ZoomLevel = 13; + + // Add the MapLayer to the Map. + this.mapWeatherInformation.Layers.Add(myLocationLayer); + + + + //LatitudeTextBlock.Text = geoposition.Coordinate.Latitude.ToString("0.00"); + //LongitudeTextBlock.Text = geoposition.Coordinate.Longitude.ToString("0.00"); + } + catch (Exception ex) + { + if ((uint)ex.HResult == 0x80004004) + { + // the application does not have the right capability or the location master switch is off + //StatusTextBlock.Text = "location is disabled in phone settings."; + } + //else + { + // something else happened acquring the location + } + } + } + + public static class CoordinateConverter + { + public static GeoCoordinate ConvertGeocoordinate(Geocoordinate geocoordinate) + { + return new GeoCoordinate + ( + geocoordinate.Latitude, + geocoordinate.Longitude, + geocoordinate.Altitude ?? Double.NaN, + geocoordinate.Accuracy, + geocoordinate.AltitudeAccuracy ?? Double.NaN, + geocoordinate.Speed ?? Double.NaN, + geocoordinate.Heading ?? Double.NaN + ); + } + } + + } +} \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Clouds.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Clouds.cs new file mode 100644 index 0000000..5570271 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Clouds.cs @@ -0,0 +1,10 @@ +using System; + +namespace WeatherInformation.Model.CurrentWeatherParser +{ + public class Clouds + { + public int all { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Coord.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Coord.cs new file mode 100644 index 0000000..21a07b8 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Coord.cs @@ -0,0 +1,11 @@ +using System; + +namespace WeatherInformation.Model.CurrentWeatherParser +{ + public class Coord + { + public double lon { get; set; } + public int lat { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/CurrentWeather.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/CurrentWeather.cs new file mode 100644 index 0000000..05d0c21 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/CurrentWeather.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace WeatherInformation.Model.CurrentWeatherParser +{ + public class CurrentWeather + { + public Coord coord { get; set; } + public Sys sys { get; set; } + public List weather { get; set; } + public string @base { get; set; } + public Main main { get; set; } + public Wind wind { get; set; } + public Rain rain { get; set; } + public Clouds clouds { get; set; } + public int dt { get; set; } + public int id { get; set; } + public string name { get; set; } + public int cod { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Main.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Main.cs new file mode 100644 index 0000000..2840930 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Main.cs @@ -0,0 +1,14 @@ +using System; + +namespace WeatherInformation.Model.CurrentWeatherParser +{ + public class Main + { + public double temp { get; set; } + public int pressure { get; set; } + public int humidity { get; set; } + public double temp_min { get; set; } + public double temp_max { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Rain.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Rain.cs new file mode 100644 index 0000000..14229be --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Rain.cs @@ -0,0 +1,20 @@ +using System; + +namespace WeatherInformation.Model.CurrentWeatherParser +{ + public class Rain + { + private double threeHours; + + public void set3h(double three) + { + this.threeHours = three; + } + + public double get3h() + { + return this.threeHours; + } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Sys.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Sys.cs new file mode 100644 index 0000000..002e8cd --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Sys.cs @@ -0,0 +1,13 @@ +using System; + +namespace WeatherInformation.Model.CurrentWeatherParser +{ + public class Sys + { + public double message { get; set; } + public string country { get; set; } + public int sunrise { get; set; } + public int sunset { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Weather.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Weather.cs new file mode 100644 index 0000000..6f5529f --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Weather.cs @@ -0,0 +1,13 @@ +using System; + +namespace WeatherInformation.Model.CurrentWeatherParser +{ + public class Weather + { + public int id { get; set; } + public string main { get; set; } + public string description { get; set; } + public string icon { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Wind.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Wind.cs new file mode 100644 index 0000000..6668990 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/CurrentWeatherParser/Wind.cs @@ -0,0 +1,11 @@ +using System; + +namespace WeatherInformation.Model.CurrentWeatherParser +{ + public class Wind + { + public double speed { get; set; } + public int deg { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/City.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/City.cs new file mode 100644 index 0000000..6dd2b8b --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/City.cs @@ -0,0 +1,14 @@ +using System; + +namespace WeatherInformation.Model.ForecastWeatherParser +{ + public class City + { + public int id { get; set; } + public string name { get; set; } + public Coord coord { get; set; } + public string country { get; set; } + public int population { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Coord.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Coord.cs new file mode 100644 index 0000000..3f2f2f8 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Coord.cs @@ -0,0 +1,11 @@ +using System; + +namespace WeatherInformation.Model.ForecastWeatherParser +{ + public class Coord + { + public double lon { get; set; } + public double lat { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/ForecastWeather.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/ForecastWeather.cs new file mode 100644 index 0000000..e8e6bfe --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/ForecastWeather.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace WeatherInformation.Model.ForecastWeatherParser +{ + public class ForecastWeather + { + public string cod { get; set; } + public double message { get; set; } + public City city { get; set; } + public int cnt { get; set; } + public List list { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/List.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/List.cs new file mode 100644 index 0000000..6b9c0dd --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/List.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace WeatherInformation.Model.ForecastWeatherParser +{ + public class List + { + public int dt { get; set; } + public Temp temp { get; set; } + public double pressure { get; set; } + public int humidity { get; set; } + public List weather { get; set; } + public double speed { get; set; } + public int deg { get; set; } + public int clouds { get; set; } + public double rain { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Temp.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Temp.cs new file mode 100644 index 0000000..cc420c3 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Temp.cs @@ -0,0 +1,15 @@ +using System; + +namespace WeatherInformation.Model.ForecastWeatherParser +{ + public class Temp + { + public double day { get; set; } + public double min { get; set; } + public double max { get; set; } + public double night { get; set; } + public double eve { get; set; } + public double morn { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Weather.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Weather.cs new file mode 100644 index 0000000..de25421 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/ForecastWeatherParser/Weather.cs @@ -0,0 +1,13 @@ +using System; + +namespace WeatherInformation.Model.ForecastWeatherParser +{ + public class Weather + { + public int id { get; set; } + public string main { get; set; } + public string description { get; set; } + public string icon { get; set; } + } +} + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/JsonDataParser/JsonParser.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/JsonDataParser/JsonParser.cs new file mode 100644 index 0000000..3f077cb --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/JsonDataParser/JsonParser.cs @@ -0,0 +1,28 @@ +using Newtonsoft.Json; +using WeatherInformation.Model.CurrentWeatherParser; +using WeatherInformation.Model.ForecastWeatherParser; +using System; + +namespace WeatherInformation.Model.JsonDataParser +{ + class JsonParser + { + /// + /// The _json settings. + /// + private static readonly JsonSerializerSettings _jsonSettings = + new JsonSerializerSettings + { + Error = delegate(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args) + { + //Console.WriteLine(args.ErrorContext.Error.Message); No logs for WP8 :( + args.ErrorContext.Handled = true; + } + }; + + public TWeatherData ParserWeatherData(String jsonData) + { + return JsonConvert.DeserializeObject(jsonData, _jsonSettings); + } + } +} diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Model/Services/ServiceParser.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Model/Services/ServiceParser.cs new file mode 100644 index 0000000..d855c90 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Model/Services/ServiceParser.cs @@ -0,0 +1,31 @@ +using WeatherInformation.Model.CurrentWeatherParser; +using WeatherInformation.Model.ForecastWeatherParser; +using WeatherInformation.Model.JsonDataParser; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WeatherInformation.Model.Services +{ + class ServiceParser + { + private readonly JsonParser _jsonParser; + + public ServiceParser(JsonParser jsonParser) + { + this._jsonParser = jsonParser; + } + + public CurrentWeather GetCurrentWeather(String jsonData) + { + return this._jsonParser.ParserWeatherData(jsonData); + } + + public ForecastWeather GetForecastWeather(String jsonData) + { + return this._jsonParser.ParserWeatherData(jsonData); + } + } +} diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Properties/AppManifest.xml b/WindowsPhone/WeatherInformation/WeatherInformation/Properties/AppManifest.xml new file mode 100644 index 0000000..3b998eb --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Properties/AppManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Properties/AssemblyInfo.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1181882 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Resources; + +// La información general de un ensamblado se controla mediante el siguiente +// conjunto de atributos. Cambie los valores de estos atributos para modificar la información +// asociada a un ensamblado. +[assembly: AssemblyTitle("WeatherInformation")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WeatherInformation")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Si ComVisible se establece en False, los componentes COM no verán los +// tipos de este ensamblado. Si necesita obtener acceso a un tipo de este ensamblado desde +// COM, establezca el atributo ComVisible en True en este tipo. +[assembly: ComVisible(false)] + +// El siguiente GUID sirve como identificador de typelib si este proyecto se expone a COM +[assembly: Guid("21be107b-f7de-4ff1-b103-90430c323fe2")] + +// La información de versión de un ensamblado consta de los cuatro valores siguientes: +// +// Versión principal +// Versión secundaria +// Número de compilación +// Revisión +// +// Puede especificar todos los valores o usar los valores predeterminados de número de compilación y revisión +// mediante el carácter '*', como se muestra a continuación: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: NeutralResourcesLanguageAttribute("es-ES")] diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Properties/WMAppManifest.xml b/WindowsPhone/WeatherInformation/WeatherInformation/Properties/WMAppManifest.xml new file mode 100644 index 0000000..6f0fb18 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Properties/WMAppManifest.xml @@ -0,0 +1,47 @@ + + + + + + + + Assets\ApplicationIcon.png + + + + + + + + + + + + + + + + Assets\Tiles\FlipCycleTileSmall.png + 0 + Assets\Tiles\FlipCycleTileMedium.png + WeatherInformation + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Resources/AppResources.Designer.cs b/WindowsPhone/WeatherInformation/WeatherInformation/Resources/AppResources.Designer.cs new file mode 100644 index 0000000..78ffd40 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Resources/AppResources.Designer.cs @@ -0,0 +1,138 @@ +//------------------------------------------------------------------------------ +// +// Este código fue generado por una herramienta. +// Versión de runtime:4.0.30319.17626 +// +// Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +// se vuelve a generar el código. +// +//------------------------------------------------------------------------------ + +namespace WeatherInformation.Resources +{ + using System; + + + /// + /// Clase de recurso fuertemente tipado para buscar cadenas traducidas, etc. + /// + // StronglyTypedResourceBuilder generó automáticamente esta clase + // a través de una herramienta como ResGen o Visual Studio. + // Para agregar o quitar un miembro, edite el archivo .ResX y, a continuación, vuelva a ejecutar ResGen + // con la opción /str o recompila tu proyecto de Visual Studio. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class AppResources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal AppResources() + { + } + + /// + /// Devuelve la instancia de ResourceManager almacenada en caché usada por esta clase. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager + { + get + { + if (object.ReferenceEquals(resourceMan, null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WeatherInformation.Resources.AppResources", typeof(AppResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Invalida la propiedad CurrentUICulture del subproceso actual para todas las + /// búsquedas de recursos usando esta clase de recursos fuertemente tipados. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + + /// + /// Busca una cadena traducida similar a LeftToRight. + /// + public static string ResourceFlowDirection + { + get + { + return ResourceManager.GetString("ResourceFlowDirection", resourceCulture); + } + } + + /// + /// Busca una cadena traducida similar a us-EN. + /// + public static string ResourceLanguage + { + get + { + return ResourceManager.GetString("ResourceLanguage", resourceCulture); + } + } + + /// + /// Busca una cadena traducida similar a MI APLICACIÓN. + /// + public static string ApplicationTitle + { + get + { + return ResourceManager.GetString("ApplicationTitle", resourceCulture); + } + } + + /// + /// Busca una cadena traducida similar a Valor de propiedad en tiempo de ejecución de ejemplo. + /// + public static string SampleProperty + { + get + { + return ResourceManager.GetString("SampleProperty", resourceCulture); + } + } + + /// + /// Busca una cadena traducida similar al texto del botón. + /// + public static string AppBarButtonText + { + get + { + return ResourceManager.GetString("AppBarButtonText", resourceCulture); + } + } + + /// + /// Busca una cadena traducida similar a elemento de menú. + /// + public static string AppBarMenuItemText + { + get + { + return ResourceManager.GetString("AppBarMenuItemText", resourceCulture); + } + } + } +} \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/Resources/AppResources.resx b/WindowsPhone/WeatherInformation/WeatherInformation/Resources/AppResources.resx new file mode 100644 index 0000000..7f350d6 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/Resources/AppResources.resx @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + LeftToRight + Controls the FlowDirection for all elements in the RootFrame. Set to the traditional direction of this resource file's language + + + es-ES + Controls the Language and ensures that the font for all elements in the RootFrame aligns with the app's language. Set to the language code of this resource file's language. + + + MI APLICACIÓN + + + Valor de propiedad en tiempo de ejecución de ejemplo + + + agregar + + + Elemento de menú + + \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/SampleData/MainViewModelSampleData.xaml b/WindowsPhone/WeatherInformation/WeatherInformation/SampleData/MainViewModelSampleData.xaml new file mode 100644 index 0000000..4c4241e --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/SampleData/MainViewModelSampleData.xaml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/ViewModels/ItemViewModel.cs b/WindowsPhone/WeatherInformation/WeatherInformation/ViewModels/ItemViewModel.cs new file mode 100644 index 0000000..7988bde --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/ViewModels/ItemViewModel.cs @@ -0,0 +1,130 @@ +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; + +namespace WeatherInformation.ViewModels +{ + public class ItemViewModel : INotifyPropertyChanged + { + private string _lineOne; + /// + /// Propiedad Sample ViewModel; esta propiedad se usa en la vista para mostrar su valor mediante un enlace. + /// + /// + public string LineOne + { + get + { + return _lineOne; + } + set + { + if (value != _lineOne) + { + _lineOne = value; + NotifyPropertyChanged("LineOne"); + } + } + } + + private string _lineTwo; + /// + /// Propiedad Sample ViewModel; esta propiedad se usa en la vista para mostrar su valor mediante un enlace. + /// + /// + public string LineTwo + { + get + { + return _lineTwo; + } + set + { + if (value != _lineTwo) + { + _lineTwo = value; + NotifyPropertyChanged("LineTwo"); + } + } + } + + private string _lineThree; + /// + /// Propiedad Sample ViewModel; esta propiedad se usa en la vista para mostrar su valor mediante un enlace. + /// + /// + public string LineThree + { + get + { + return _lineThree; + } + set + { + if (value != _lineThree) + { + _lineThree = value; + NotifyPropertyChanged("LineThree"); + } + } + } + + private string _lineFour; + /// + /// Propiedad Sample ViewModel; esta propiedad se usa en la vista para mostrar su valor mediante un enlace. + /// + /// + public string LineFour + { + get + { + return _lineFour; + } + set + { + if (value != _lineFour) + { + _lineFour = value; + NotifyPropertyChanged("LineFour"); + } + } + } + + private string _lineFive; + /// + /// Propiedad Sample ViewModel; esta propiedad se usa en la vista para mostrar su valor mediante un enlace. + /// + /// + public string LineFive + { + get + { + return _lineFive; + } + set + { + if (value != _lineFive) + { + _lineFive = value; + NotifyPropertyChanged("LineFive"); + } + } + } + + public event PropertyChangedEventHandler PropertyChanged; + private void NotifyPropertyChanged(String propertyName) + { + PropertyChangedEventHandler handler = PropertyChanged; + if (null != handler) + { + handler(this, new PropertyChangedEventArgs(propertyName)); + } + } + } +} \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/ViewModels/MainViewModel.cs b/WindowsPhone/WeatherInformation/WeatherInformation/ViewModels/MainViewModel.cs new file mode 100644 index 0000000..3deea79 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/ViewModels/MainViewModel.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Globalization; +using WeatherInformation.Model.ForecastWeatherParser; +using WeatherInformation.Model.JsonDataParser; +using WeatherInformation.Model.Services; +using WeatherInformation.Resources; + +namespace WeatherInformation.ViewModels +{ + public class MainViewModel : INotifyPropertyChanged + { + public MainViewModel() + { + this.ForecastItems = new ObservableCollection(); + this.CurrentItems = new ObservableCollection(); + this._serviceParser = new ServiceParser(new JsonParser()); + } + + /// + /// Colección para objetos ItemViewModel. + /// + public ObservableCollection ForecastItems { get; private set; } + public ObservableCollection CurrentItems { get; private set; } + //public string ForecastHeader { get; private set; } + + private string _sampleProperty = "Sample Runtime Property Value"; + + private readonly ServiceParser _serviceParser; + + string _jsonForeCastWeatherData = + "{" + + "\"cod\":\"200\"," + + "\"message\":0.0048," + + "\"city\":{\"id\":2641549,\"name\":\"Newtonhill\",\"coord\":{\"lon\":-2.15,\"lat\":57.033329},\"country\":\"GB\",\"population\":0}," + + "\"cnt\":15," + + "\"list\":[" + + "{\"dt\":1397304000,\"temp\":{\"day\":286.15,\"min\":284.62,\"max\":286.15,\"night\":284.62,\"eve\":285.7,\"morn\":286.15},\"pressure\":1016.67,\"humidity\":84,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"speed\":7.68,\"deg\":252,\"clouds\":0,\"rain\":0.25}," + + "{\"dt\":1397390400,\"temp\":{\"day\":284.92,\"min\":282.3,\"max\":284.92,\"night\":282.3,\"eve\":283.79,\"morn\":284.24},\"pressure\":1021.62,\"humidity\":84,\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"speed\":7.91,\"deg\":259,\"clouds\":92}," + + "{\"dt\":1397476800,\"temp\":{\"day\":282.1,\"min\":280.32,\"max\":282.1,\"night\":280.32,\"eve\":281.51,\"morn\":281.65},\"pressure\":1033.84,\"humidity\":92,\"weather\":[{\"id\":801,\"main\":\"Clouds\",\"description\":\"few clouds\",\"icon\":\"02d\"}],\"speed\":8.37,\"deg\":324,\"clouds\":20}," + + "{\"dt\":1397563200,\"temp\":{\"day\":280.73,\"min\":280.11,\"max\":281.4,\"night\":281.4,\"eve\":280.75,\"morn\":280.11},\"pressure\":1039.27,\"humidity\":97,\"weather\":[{\"id\":801,\"main\":\"Clouds\",\"description\":\"few clouds\",\"icon\":\"02d\"}],\"speed\":7.31,\"deg\":184,\"clouds\":12}," + + "{\"dt\":1397649600,\"temp\":{\"day\":281.73,\"min\":281.03,\"max\":282.22,\"night\":281.69,\"eve\":282.22,\"morn\":281.03},\"pressure\":1036.05,\"humidity\":90,\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"speed\":7.61,\"deg\":205,\"clouds\":68}," + + "{\"dt\":1397736000,\"temp\":{\"day\":282.9,\"min\":281.45,\"max\":283.21,\"night\":282.71,\"eve\":283.06,\"morn\":281.49},\"pressure\":1029.39,\"humidity\":83,\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"speed\":6.17,\"deg\":268,\"clouds\":56}," + + "{\"dt\":1397822400,\"temp\":{\"day\":285.26,\"min\":281.55,\"max\":285.26,\"night\":282.48,\"eve\":285.09,\"morn\":281.55},\"pressure\":1025.83,\"humidity\":0,\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"sky is clear\",\"icon\":\"01d\"}],\"speed\":5.31,\"deg\":221,\"clouds\":10}," + + "{\"dt\":1397908800,\"temp\":{\"day\":284.29,\"min\":281.5,\"max\":284.29,\"night\":282.53,\"eve\":283.58,\"morn\":281.5},\"pressure\":1024.55,\"humidity\":0,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"speed\":5.51,\"deg\":192,\"clouds\":6}," + + "{\"dt\":1397995200,\"temp\":{\"day\":283.36,\"min\":281.62,\"max\":284.34,\"night\":284.04,\"eve\":284.34,\"morn\":281.62},\"pressure\":1019.58,\"humidity\":0,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"speed\":7.66,\"deg\":149,\"clouds\":0,\"rain\":0.48}," + + "{\"dt\":1398081600,\"temp\":{\"day\":282.24,\"min\":280.51,\"max\":282.41,\"night\":280.51,\"eve\":282.41,\"morn\":280.9},\"pressure\":1027.35,\"humidity\":0,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"speed\":8.17,\"deg\":221,\"clouds\":10,\"rain\":0.94}," + + "{\"dt\":1398168000,\"temp\":{\"day\":282.28,\"min\":279.76,\"max\":282.28,\"night\":280.69,\"eve\":281.13,\"morn\":279.76},\"pressure\":1038.31,\"humidity\":0,\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"sky is clear\",\"icon\":\"01d\"}],\"speed\":6.33,\"deg\":172,\"clouds\":1}," + + "{\"dt\":1398254400,\"temp\":{\"day\":281.54,\"min\":280.52,\"max\":281.54,\"night\":281.44,\"eve\":281.23,\"morn\":280.52},\"pressure\":1022.4,\"humidity\":0,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"speed\":7.84,\"deg\":140,\"clouds\":91,\"rain\":1.24}," + + "{\"dt\":1398340800,\"temp\":{\"day\":282.1,\"min\":280.66,\"max\":282.78,\"night\":280.97,\"eve\":282.78,\"morn\":280.66},\"pressure\":1013.39,\"humidity\":0,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"speed\":9.43,\"deg\":164,\"clouds\":98,\"rain\":1.03}," + + "{\"dt\":1398427200,\"temp\":{\"day\":282.11,\"min\":280.72,\"max\":282.32,\"night\":282.32,\"eve\":280.99,\"morn\":280.72},\"pressure\":1018.65,\"humidity\":0,\"weather\":[{\"id\":502,\"main\":\"Rain\",\"description\":\"heavy intensity rain\",\"icon\":\"10d\"}],\"speed\":5.26,\"deg\":158,\"clouds\":83,\"rain\":14.4}," + + "{\"dt\":1398513600,\"temp\":{\"day\":282.75,\"min\":280.61,\"max\":282.75,\"night\":280.61,\"eve\":281.75,\"morn\":281.96},\"pressure\":1007.4,\"humidity\":0,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"speed\":9.18,\"deg\":198,\"clouds\":35,\"rain\":0.55}" + + "]}"; + + /// + /// Propiedad Sample ViewModel; esta propiedad se usa en la vista para mostrar su valor mediante un enlace + /// + /// + public string SampleProperty + { + get + { + return _sampleProperty; + } + set + { + if (value != _sampleProperty) + { + _sampleProperty = value; + NotifyPropertyChanged("SampleProperty"); + } + } + } + + /// + /// Propiedad de ejemplo que devuelve una cadena traducida + /// + public string LocalizedSampleProperty + { + get + { + return AppResources.SampleProperty; + } + } + + public bool IsDataLoaded + { + get; + private set; + } + + /// + /// Crear y agregar unos pocos objetos ItemViewModel a la colección Items. + /// + public void LoadData() + { + ForecastWeather weather = this._serviceParser.GetForecastWeather(this._jsonForeCastWeatherData); + + foreach (WeatherInformation.Model.ForecastWeatherParser.List item in weather.list) + { + DateTime unixTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + DateTime date = unixTime.AddSeconds(item.dt).ToLocalTime(); + this.ForecastItems.Add(new ItemViewModel() + { + LineOne = date.ToString("ddd", CultureInfo.InvariantCulture), + LineTwo = date.ToString("dd", CultureInfo.InvariantCulture), + LineThree = String.Format("{0:0.##}", item.temp.max), + LineFour = String.Format("{0:0.##}", item.temp.min), + LineFive = "/Assets/Tiles/IconicTileMediumLarge.png" + }); + } + + this.IsDataLoaded = true; + } + + public event PropertyChangedEventHandler PropertyChanged; + private void NotifyPropertyChanged(String propertyName) + { + PropertyChangedEventHandler handler = PropertyChanged; + if (null != handler) + { + handler(this, new PropertyChangedEventArgs(propertyName)); + } + } + } +} \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/WeatherInformation.csproj b/WindowsPhone/WeatherInformation/WeatherInformation/WeatherInformation.csproj new file mode 100644 index 0000000..9bd64e9 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/WeatherInformation.csproj @@ -0,0 +1,197 @@ + + + + Debug + AnyCPU + 10.0.20506 + 2.0 + {71D9693C-AF50-4D7F-AC37-811BA1F1A0D7} + {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + WeatherInformation + WeatherInformation + WindowsPhone + v8.0 + $(TargetFrameworkVersion) + true + + + true + true + WeatherInformation_$(Configuration)_$(Platform).xap + Properties\AppManifest.xml + WeatherInformation.App + true + 11.0 + true + + + true + full + false + Bin\Debug + DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + prompt + 4 + + + pdbonly + true + Bin\Release + TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + prompt + 4 + + + true + full + false + Bin\x86\Debug + DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + prompt + 4 + + + pdbonly + true + Bin\x86\Release + TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + prompt + 4 + + + true + full + false + Bin\ARM\Debug + DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + prompt + 4 + + + pdbonly + true + Bin\ARM\Release + TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + prompt + 4 + + + + App.xaml + + + + MainPage.xaml + + + MapPage.xaml + + + + + + + + + + + + + + + + + + + + True + True + AppResources.resx + + + + + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + + + + + Designer + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + PublicResXFileCodeGenerator + AppResources.Designer.cs + + + + + ..\packages\Newtonsoft.Json.6.0.3\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll + + + + + + + \ No newline at end of file diff --git a/WindowsPhone/WeatherInformation/WeatherInformation/packages.config b/WindowsPhone/WeatherInformation/WeatherInformation/packages.config new file mode 100644 index 0000000..b1d93b5 --- /dev/null +++ b/WindowsPhone/WeatherInformation/WeatherInformation/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file -- 2.1.4