estrategias para desarrollo crossplatform en windows phone 8 y windows 8
TRANSCRIPT
![Page 1: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/1.jpg)
![Page 2: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/2.jpg)
![Page 3: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/3.jpg)
Windows Phone 8 App Windows 8 App
![Page 4: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/4.jpg)
Windows Phone 8 App Windows 8 App
XAML UI
Framework
.NET Code
(C#; VB.NET)
Windows Runtime
APIs
Partner Runtime Engines
DirectX 11Native Interop
Component
Windows Runtime
APIs
IE10 Web Browser Control
Partner Runtimes & Game Engines
![Page 5: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/5.jpg)
Separar lógica de interfaz de usuario y la aplicación utilizando el patrón de MVVM
Compartir funcionalidad utilizando bibliotecas de clases de portables
Compartir código con Archivos Enlazados
Manejo de las diferencias de plataforma de Windows Phone y Windows 8
Compartir utilizando componentes Windows Runtime
![Page 6: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/6.jpg)
![Page 7: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/7.jpg)
![Page 8: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/8.jpg)
1. Un origen
2. Un proyecto
3. Un ensamblado
Multiples plataformas
![Page 9: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/9.jpg)
![Page 10: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/10.jpg)
![Page 11: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/11.jpg)
![Page 12: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/12.jpg)
![Page 13: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/13.jpg)
![Page 14: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/14.jpg)
Plataforma Pueden crear Pueden consumir
Windows Phone 8 C++ C++, C#, VB
Windows 8 C++, C#, VB C++, C#, VB, Javascript
![Page 15: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/15.jpg)
![Page 16: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/16.jpg)
![Page 17: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/17.jpg)
User Interface
App Logic
General Model-View-ViewModel (MVVM)
![Page 18: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/18.jpg)
![Page 19: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/19.jpg)
Model
View
ViewModel
Data BindingsOne way
One time
Two way
Commands
Interfaz de Usuario
Clases con solo propiedades querepresentan las fuentes de los datos (archivos, servicios, bases de datos)
Estructuras querepresentan los contextosde datos de las pantallas y el que permiten el accesoa la logica de negocio
![Page 20: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/20.jpg)
Aplicaciones de escritorio, web forms
Caja de texto
Etiqueta
Form.cs (Code behind C#)
Form.designer.cs (C#)
Clase
Form
Este es el escenario “típico” de un
desarrollador .NET hasta antes de
XAML o MVC”
Aplicaciones XAML
Caja de texto
Etiqueta
MainPage.xaml
(Lenguaje declarativo XAML)
MainPage.xaml.cs (Code behind C#)
Clase
MainPage
![Page 21: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/21.jpg)
Usando XAML se pueden crear de forma declarativa los mismos elementos gráficos que se crearían en código
<StackPanel><TextBox/><Button/>
</StackPanel>
StackPanel stackPanel = new StackPanel();
TextBox textBox = new TextBox();stackPanel.Children.Add(textBox);
Button button = new Button();stackPanel.Children.Add(button);
![Page 22: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/22.jpg)
Ambos escenarios permiten acceder a los controles de la pantalla como miembros de la clase que los contiene es decir
this.txtMensaje.Text = “Hola”;
Y crear event handlers para poner el código relacionado a una interacción del usuario, por ejemplo el click de un botón
private void Button_Click(object sender, RoutedEventArgs e) { //Code }
Ahora bien, el que esto se permita no significa que sea la práctica “sugerida”.
![Page 23: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/23.jpg)
Model
View (XAML y Code behind)
ViewModel
Data Bindings Commands
Trabajar con MVVM es una de las estrategias cross platform cuyo primer paso es entender en que parte se ubica nuestro “anterior” esquema de trabajo.
Como podemos observar, trabajar de la forma típica no es más que trabajar sobre las vistas. ¿Funciona? Si, pero no es la practica correcta.
Algunos desarrolladores alcanzan a llegar hasta implementar Vistas Modelos como contextos de datos, sin embargo los manipulan desde el code behind, lo que es inapropiado.
![Page 24: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/24.jpg)
![Page 25: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/25.jpg)
Nombre
Editar perfil
Apellido
![Page 26: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/26.jpg)
<StackPanel x:Name="ContentPanel" Margin="12,0,12,0" Grid.Row="1" >
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
<TextBox Height="72" TextWrapping="Wrap" Text="TextBox"/>
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
<TextBox Height="72" TextWrapping="Wrap" Text="TextBox"/>
<Button Content="Button"/>
</StackPanel>
![Page 27: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/27.jpg)
<StackPanel x:Name="ContentPanel" Margin="12,0,12,0" Grid.Row="1" DataContext="{Binding Persona}" >
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
<TextBox Height="72" TextWrapping="Wrap" Text="{Binding Nombre, Mode=TwoWay}"/>
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
<TextBox Height="72" TextWrapping="Wrap" Text="{Binding Apellido, Mode=TwoWay}"/>
<Button Content="Button"/>
</StackPanel>
![Page 28: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/28.jpg)
<Grid x:Name="LayoutRoot" Background="Transparent"
d:DataContext="{Binding Source={StaticResource SampleDataSource}}">
<StackPanel x:Name="ContentPanel" Margin="12,0,12,0" Grid.Row="1“
DataContext="{Binding Persona}" >
</StackPanel>
</Grid>
![Page 29: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/29.jpg)
class Class Model
CategoryViewModel
+ Identifier :int
+ Name :string
+ Tasks :ObservableCollection<TaskViewModel>
TaskViewModel
+ Identifier :int
+ Name :string
+ PlannedDate :DateTime
+ Pomori :int
+ Status :TaskStatus
+ Delete() :void
+ Save() :void
MainViewModel
+ SelectedTask :TaskViewModel
+ TasksByCategory :ObservableCollection<CategoryViewModel>
![Page 30: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/30.jpg)
Fuente: http://www.slideshare.net/soreygarcia/planificando-las-bases-de-una-aplicacin-windows-phone
![Page 31: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/31.jpg)
ADD/MODIFY TASK
SETTINGS
SPLASH
ABOUT
TASK S LIST
PRODUCTIVITY REPORT
![Page 32: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/32.jpg)
class Class Model
CategoryViewModel TaskViewModel
MainViewModel
Task's List
«boundary»
Add/Modify Task
«boundary»
«binding»
«binding»
Fuente: http://www.slideshare.net/soreygarcia/planificando-las-bases-de-una-aplicacin-windows-phone
![Page 33: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/33.jpg)
public class ItemViewModel : INotifyPropertyChanged{
private string lineOne;public string LineOne{
get { return lineOne; }set {
if (value != lineOne){lineOne = value;NotifyPropertyChanged("LineOne");
}}
}
public event PropertyChangedEventHandler PropertyChanged;private void NotifyPropertyChanged(String propertyName){
if (null != PropertyChanged) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}}
![Page 34: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/34.jpg)
![Page 35: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/35.jpg)
public class MainViewModel : BindableBase
{
private String nombre;
public String Nombre
{
get
{
return this.nombre;
}
set
{
Set<String>(ref nombre, value);
}
}
![Page 36: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/36.jpg)
private static HueClientViewModel hueClientVM = null;public static HueClientViewModel HueClientVM{
get{if (hueClientVM == null)
hueClientVM = new HueClientViewModel();return hueClientVM;
}}
public HueClientView(){
InitializeComponent();this.DataContext = App.HueClientVM;
}
![Page 37: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/37.jpg)
<Application x:Class="Hue_Demo_Phone.App“ ...xmlns:vm="clr-namespace:Hue_Demo_Phone.ViewModels">
<Application.Resources><vm:HueClientViewModel x:Key="HueClientVM" />
</Application.Resources>
<phone:PhoneApplicationPage ..."DataContext="{StaticResource HueClientVM}">
![Page 38: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/38.jpg)
![Page 39: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/39.jpg)
MVVM Simple
![Page 40: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/40.jpg)
![Page 41: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/41.jpg)
EventsEvent
Handlers
Commanding
![Page 42: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/42.jpg)
<StackPanel x:Name="ContentPanel" Margin="12,0,12,0" Grid.Row="1" DataContext="{Binding Persona}" >
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
<TextBox Height="72" TextWrapping="Wrap" Text="{Binding Nombre, Mode=TwoWay}"/>
<TextBlock TextWrapping="Wrap" Text="TextBlock"/>
<TextBox Height="72" TextWrapping="Wrap" Text="{Binding Apellido, Mode=TwoWay}"/>
<Button Content="Button" Command="{Binding GuardarPerfilCommand}"/>
</StackPanel>
![Page 43: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/43.jpg)
<Button Content="Press this" Height="72" Margin="90,464,0,0" Name="button1" Width="300"Command="{Binding HelloCommand}"/>
<ListBox Height="100" x:Name="listBox1" ><i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged"><i:InvokeCommandAction Command="{Binding SelectionChanged}"
CommandParameter="{Binding ElementName=listBox1, Path=SelectedIndex}"/></i:EventTrigger>
</i:Interaction.Triggers></ListBox>
![Page 44: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/44.jpg)
public interface ICommand{
void Execute(object parameter);
bool CanExecute(object parameter);event EventHandler CanExecuteChanged;
}
public class HelloWorldCommand : ICommand{
public void Execute(object parameter){
Debug.WriteLine("Hello, world");}
public bool CanExecute(object parameter){
return true;}public event EventHandler CanExecuteChanged;
}
new HelloWorldCommand().Execute(null);
![Page 45: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/45.jpg)
![Page 46: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/46.jpg)
public MainViewModel()
{
this.guardarPerfilCommand = new RelayCommand(GuardarPerfil, null);
}
#region GuardarPerfil
private ICommand guardarPerfilCommand;
public ICommand GuardarPerfilCommand
{
get { return this.guardarPerfilCommand; }
}
private async void GuardarPerfil()
{
//Code
}
#endregion GuardarPerfil
![Page 47: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/47.jpg)
![Page 48: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/48.jpg)
Navigation Service
Network Service
LocalDatabaseService
SocialService
SettingsService
RoamingService
SecurityService
![Page 49: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/49.jpg)
![Page 50: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/50.jpg)
MVVM Intermedio
![Page 51: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/51.jpg)
![Page 52: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/52.jpg)
public class MainViewModel{
private DataService dataSvc;
public MainViewModel(){dataSvc= new DataService();
}
public void XYZmethod(){
var theCar = dataSvc.Car;...NavigationService.Instance.GoBack();
}...
}
![Page 53: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/53.jpg)
![Page 54: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/54.jpg)
NavigationService INavigationService
NavigateTo Uri
Application PhoneApplicationFrame
Application PhoneApplicationFrame
![Page 55: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/55.jpg)
public class MainViewModel{
private IDataService dataSvc;private INavigationService navSvc;
public MainViewModel(IDataService data,INavigationService nav)
{dataSvc= data;navSvc = nav;
}
public void XYZmethod(){
var theCar = dataSvc.Car;...navSvc.GoBack();
}...
}
![Page 56: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/56.jpg)
![Page 57: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/57.jpg)
<phone:PhoneApplicationPage><!-- XAML --><phone:PhoneApplicationPage.DataContext>
<Binding Path="Main" Source="{StaticResource Locator}"/>
</phone:PhoneApplicationPage.DataContext>
<Grid x:Name="LayoutRoot" Background="Transparent" >
<StackPanel x:Name="ContentPanel" Margin="12,0,12,0" Grid.Row="1“
DataContext="{Binding Persona}" >
</StackPanel>
</Grid>
![Page 58: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/58.jpg)
![Page 59: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/59.jpg)
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); // Using SimpleIOC
// Register Services
if (ViewModelBase.IsInDesignModeStatic)
SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
else
SimpleIoc.Default.Register<IDataService, DataService>();
SimpleIoc.Default.Register<INavigationService, NavigationService>();
// Register ViewModels
SimpleIoc.Default.Register<MainViewModel>();
}
// Following property returns an instance of MainViewModel, with dependencies injected
public MainViewModel Main
{
get { return ServiceLocator.Current.GetInstance<MainViewModel>(); }
}
}
![Page 60: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/60.jpg)
Repository Pattern
Messenger Pattern
EventToCommand
![Page 61: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/61.jpg)
MVVM Avanzado
![Page 62: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/62.jpg)
![Page 63: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/63.jpg)
![Page 64: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/64.jpg)
http://aka.ms/ShareCode
![Page 65: Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8](https://reader030.vdocuments.site/reader030/viewer/2022020217/5549ebd7b4c90512488b4f80/html5/thumbnails/65.jpg)