GUI de Windows: WPF o WinRT (2015+)


94

Estoy tratando de obtener una descripción general de las diferentes tecnologías para usar al crear GUI en Windows World.

Para el contexto, estoy construyendo un pequeño juego multijugador de plataformas 2D. (Solo con el propósito de aprender ..)

Mi maestro dice que cree que WPF es el camino correcto, pero parece que solo lo compara con Windows Forms.

Mi entendimiento es que aquí en 2015, ¿Windows Forms está totalmente muerto?

En estas otras preguntas de stackover, dicen que WinRT + XAML es para la construcción de GUI de Metro (¡cosa de mosaicos de Windows 8!), Y parece que WPF es algo que se usa solo para escritorio en Windows 7/8 y está estrechamente relacionado con Silverlight.

¿Cómo se compara Windows 8 Runtime (WinRT / aplicaciones de la tienda de Windows / aplicación universal de Windows 10) con Silverlight y WPF?

  • El escritorio es donde viven las aplicaciones antiguas (rojo. WFP).
  • La nueva clase de aplicaciones, las aplicaciones Metro, se pueden construir de varias formas, incluso mediante VB.NET, C # o C ++. Estas tres opciones de idioma pueden usar XAML para crear la interfaz de usuario. La alternativa es utilizar JavaScript / HTML5 / CSS para el desarrollo tanto de la interfaz de usuario como del código de la aplicación.

Mi verdadera pregunta es: ¿No hay UNA buena manera de construir GUI en Window World?

Y si no es así, ¿qué tecnologías se deben usar en Windows 7, Windows 8 (Desktop y Metro), Windows Phone (¡y Windows 10!), E incluso x-box ...

¿Es con diferentes tecnologías para comparar de esta manera?

¿En qué crees que es correcto invertir tiempo?


5
"¿WPF o WinRT?". Aprenda ambos, WPF para el escritorio, Windows Runtime para dispositivos móviles. Estas tecnologías tienen muchas cosas en común, como XAML y un marco muy similar. Incluso puede escribir código que admita ambas plataformas, como bibliotecas de clases portátiles.
Clemens

2
@Clemens El último bit es un poco engañoso. Las bibliotecas .NET estándar deben reconstruirse / dirigirse para que funcionen con aplicaciones WinRT, que pueden requerir cambios de código para ciertas clases.
BradleyDotNET

3
Windows Forms no está totalmente muerto, pero probablemente no quiera usarlo a menos que ya esté familiarizado con él.
Casey

2
Su objetivo de "mantenerse actualizado en la GUI de Windows" es bastante perjudicial en mi opinión. Hay poco futuro en esto para el desarrollador promedio a largo plazo. MS ha cambiado sus herramientas para GUI tantas veces mientras que JavaScript y HTML5 seguían ganando terreno. Si te estás desarrollando para vivir, olvídate de todo lo demás. Pocas excepciones a esto, si está trabajando para MS o un proveedor externo de GUI o si está dispuesto a mantener el código antiguo.
NoChance

3
Incluso MFC no está totalmente muerto, y tampoco Win32. Pero MFC para juegos es lo que elegiría un loco
Lothar

Respuestas:


132

Hay mucho aquí, pero aquí va:

  • ¿Windows Forms (Winforms) está muerto ? No. Aún recibe apoyo activo. Dicho esto, es una tecnología horrible para trabajar (al menos una vez que conoces la magia de WPF)
  • Si desea crear una aplicación de escritorio atractiva y bien diseñada (clásica, no Metro), WPF es la respuesta en términos puros .NET. Usted puede utilizar las API de WinRT (como sus clases de socket) pero no se puede ejecutar en sistemas operativos antes de que Windows 8. La interfaz de usuario es todavía WPF.
  • Las aplicaciones WinRT son para la Tienda Windows 8 (también están disponibles en la Tienda Windows 10). No puede usar WPF aquí o WinRT en el escritorio, por lo que el lugar donde implementa determina lo que usa. Tiene razón en su comprensión de los idiomas / tecnologías disponibles.
  • Windows Phone 8 (ahora en desuso) usa un tiempo de ejecución modificado de WinRT (esto ha cambiado en Windows 10). Para Win8 / WP8, puede utilizar aplicaciones "universales" para compartir la mayor parte del código entre una aplicación estándar de WinRT y una aplicación de Windows Phone.
  • Windows 10 usa la Plataforma universal de Windows (UWP) que se basa en .NET Core. El código desarrollado para Windows 10 también se puede usar en Xbox One, Windows Phone 10 y HoloLens. WPF sigue siendo para aplicaciones de escritorio "estándar".
  • XBox es complicado. XNA se ha ido, y Microsoft parece alejarse del contenido creado por la comunidad para la plataforma. Dicho esto, Unity3D se puede implementar en XBox, y creo que el desarrollo estándar de DirectX (C ++) funciona para ello. Las aplicaciones de la Plataforma universal de Windows también se pueden implementar en Xbox One, y esta parece ser la estrategia de Microsoft en el futuro.

En cuanto a en qué dedicar el tiempo, eso depende de a qué te dirijas :). Aprender WPF / UWP + XAML le reportará muchos beneficios si desea mantenerse "actualizado" en el desarrollo de GUI .NET, así que eso es lo que yo haría. WPF tiene la mayoría de las funciones, por lo que al comenzar allí, solo tiene que encontrar soluciones alternativas para lo que falta en UWP (o cualquier otra tecnología basada en XAML).

Si hace eso, asegúrese de aprender el patrón MVVM (Modelo-Vista-Modelo de Vista). Funciona muy bien con las tecnologías basadas en XAML y le permite compartir mucha lógica entre sus aplicaciones WPF y UWP. La misma lógica también se puede usar si eventualmente desarrolla aplicaciones Xamarin para iOS / Android, etc.

Tenga en cuenta que para un verdadero desarrollo de juegos, querrá un marco de juego real (como Unity3D o incluso XNA). Puede hacerlo en WPF, y esa es una mejor opción que Winforms, pero ninguno está destinado a juegos.


Gracias por la respuesta, ya que mi minijuego comenzó con XNA, así que lamento saber que lo eliminarán. Pero estoy deseando ver lo que nos traerá Windows 10.
Alf Nielsen

@AlfNielsen No estoy seguro de cuándo es el final del soporte, pero ciertamente parece que no lo van a actualizar pronto.
BradleyDotNET

2
Parece que VS busca el apoyo total de Unity, ¡así que felicitaciones por predecir eso! :)
BK

2
La velocidad de renderizado de WPF usando clases de WPF como Visual es horrible para juegos o cualquier cosa en tiempo real.
Extremo Sendon

2
@WingerSendon Mira RenderTransform, Viewport3Dy similares. Son acelerados por hardware.
BradleyDotNET

26

Es un hilo bastante antiguo, pero como me encontré con esto a través de Google (por interés), tal vez alguien más podría llegar aquí también. Esta es una pregunta que los nuevos programadores se hacen una y otra vez. Así que me gustaría responder algunas cosas también, ahora que Windows 10 se lanzó oficialmente.

En primer lugar, ya no se debería empezar con Windows Forms. Es la tecnología más madura por ahora, pero no habrá más desarrollo de Windows Forms, solo está en etapa de mantenimiento ahora. WPF se desarrolla activamente (última vez que leí). Pero ahora, las aplicaciones universales de Windows (WinRT one) ya no necesitan usarse en pantalla completa y se pueden usar en modo de ventana al igual que otras aplicaciones de escritorio (WPF y WinForms). Esto aumenta mucho su usabilidad en computadoras que no son tabletas. Creo que este también será el futuro de las aplicaciones de escritorio. Aunque, los softwares de WPF son las aplicaciones de escritorio tradicionales (sin permisos, solo UAC). De cualquier manera, no importa si aprendes el desarrollo de WPF o WinRT (usando .Net), terminarás aprendiendo ambos. Ambos son XAML + C # (o algún otro lenguaje .Net). Estaba aprendiendo WPF cuando WinRT salió con Windows 8. Me sentí como en casa, solo algunos cambios menores a los que te acostumbras muy pronto. Sin embargo, no estoy seguro del escenario MVVM (enlace de datos) en WinRT. Todavía estoy aprendiendo ese aspecto de WPF.

Window 10 acaba de lanzarse. Windows 8 / 8.1 no tuvo tanto éxito como Windows 7. Entonces, si desea crear una aplicación que tenga una audiencia más amplia, debería optar por WPF por ahora. Pero en un futuro cercano, WinRT será el camino a seguir.

Para su pregunta, "¿qué tecnologías se deben usar en Windows 7 , Windows 8 (escritorio y Metro), Windows Phone, (¡y Windows 10!), E incluso x-box", la única respuesta es Windows Universal Apps. Esta es la razón exacta por la que se desarrolló este marco. Una tecnología que se utilizará para desarrollar aplicaciones para todos los dispositivos. Computadora de escritorio, tableta, teléfonos (incluido Android con Xamarin incluido con Visual Studio 2015), Xbox e IoT (Internet de las cosas).


19
Las aplicaciones universales no parecen funcionar en Windows7 o Windows8. Las "aplicaciones universales" son solo "universales" para los dispositivos Win10.
Dragontamer5788

Xamarin sigue siendo algo propio (sin aplicaciones universales) y tampoco estoy seguro de que puedan implementarse en Xbox.
BradleyDotNET

2
@PrateekJain: NO sobre la ejecución de aplicaciones para UWP en Windows 8: stackoverflow.com/a/30317960/199364
ToolmakerSteve

6
WinForms sigue siendo excelente para GUI rápidas y sucias: WPF es bueno, pero requiere mucho código repetitivo (y una curva de aprendizaje empinada) para usarlo "correctamente", incluso sin MVVM. Es una mierda que WPF no tenga verdaderas capacidades de RAD, y que XAML sea tan detallado .
Dai

1
Para todos los dispositivos de mi culo. Es Microsoft hablar de nuevo en su máxima expresión. Al igual que en los viejos tiempos, cuando lo llamaban multiplataforma porque se ejecutaba en Windows95 y Windows2000. La otra cosa es que nunca quiero que las aplicaciones de escritorio tengan los mismos tamaños desagradables de botones y especialmente árboles y listas que tengo que usar para tocar. Por lo tanto, no hay UWP para mí
Lothar

23

Intentaré responder solo una de sus preguntas:

¿Windows Forms está totalmente muerto?

No, la tecnología de formularios de Windows no está muerta. Te diré por qué. WPF y XAML es una tecnología muy completa y compleja y puede crear una interfaz de usuario muy agradable. ¡Pero! Esta tecnología requiere un conocimiento profundo. Para los diseños básicos, no necesita tanto conocimiento, pero para algunos diseños avanzados debe tener un conocimiento profundo y cuando comencé con esta tecnología y pasé mucho tiempo buscando algunos consejos en Google. Entonces, cuando necesito algunos formularios simples para la entrada del usuario, siempre elijo la tecnología Windows Forms, que es muy simple y directa. Esta es también la razón por la que esta tecnología tuvo mucho éxito en el mundo. Cuando comienza con WPF, también necesita saber qué es el patrón de diseño MVVM y algunos programadores no experimentados se confunden con eso.


3
Esta es mi respuesta favorita. Para aplicaciones pequeñas, uso Windows Forms porque es muy rápido y fácil de usar. Para código de producción complejo, utilizo C ++ (con WTL) y .NET de paso lateral por completo.
Robinson

8
Para los lectores que no estén familiarizados con WPF, algunas aclaraciones: para diseños de aplicaciones básicos, WPF requiere más o menos el mismo esfuerzo. La plantilla de aplicación VS WPF predeterminada proporciona el mismo punto de partida que WinForms. MVVM no es obligatorio para trabajar con WPF, pero en realidad usar Binding sin ningún marco MVVM también es fácil para aplicaciones simples. WPF está más cerca tecnológicamente de WinRT y UWP, así que, por su propio bien, asuma que Windows Forms está muerto para cualquier otra cosa que no sea mantener aplicaciones heredadas.
también

3
Winforms es ideal para crear una aplicación de "consola" de la nueva era. Por ejemplo, un control de pestañas extremadamente básico con un montón de botones y entrada del usuario que efectivamente pone una máscara en lo que normalmente sería una aplicación de consola.
llega el

16

Ahora es abril de 2016 y todavía no hay una respuesta clara a esto. Estamos desarrollando una aplicación de escritorio de monitoreo del rendimiento en tiempo real muy moderna que tiene que representar múltiples gráficos y pantallas, entremezclados con texto y varios otros gráficos. Nuestra aplicación es C #, WPF con .NET Framework 4.5.2 pero todavía estamos escribiendo algunos componentes usando WinForms y GDI + para obtener un rendimiento aceptable. Simplemente no lo hemos logrado con WPF. Incluso hemos desarrollado un par de pantallas en la aplicación con DirectX, pero eso agrega mucha complejidad que solo algunos miembros del equipo pueden admitir. La simplicidad y la velocidad pura que podemos obtener al alojar una pantalla de WinForms dentro de WPF y la velocidad de GDI + nos brindan lo que necesitamos al costo de la estructura pura de View / ViewModel, además de tener que lidiar con varios problemas del espacio aéreo. Nuestra aplicación es bastante especializada y me encantaría deshacerme de WinForms por completo, pero desafortunadamente esto aún no es posible en nuestro caso. Para obtener un rendimiento puro, deberá utilizar DirectX o WinForms.


1
Te diré que algunas cosas funcionan mejor en WinForms. Hay otras cosas (animaciones en particular) para las que ocurre lo contrario. Por supuesto, ir directamente a DirectX probablemente sería incluso mejor, pero nadie quiere hacer esto como usted señaló.
BradleyDotNET

1
Después de WinRT, decidí empezar a buscar en otra parte. Mis clientes y yo no podemos confiar demasiado en lo que Microsoft quiere, ya que afecta mis resultados y los de mis clientes. Ahora estoy viendo una aplicación autohospedada que utiliza un servidor web local para servir las páginas de la aplicación localmente al navegador del usuario o al control del navegador integrado en una aplicación WinForm / WPF. Esto simplifica el desarrollo, me acerca a la compatibilidad multiplataforma y, obviamente, reduce los costos.
TheLegendaryCopyCoder

6

Mis dos centavos ... si quieres verdaderas aplicaciones universales, es decir, programas que pueden ejecutarse en CUALQUIER sistema operativo de escritorio, incluido Windows, WinForms sigue siendo el camino a seguir. Solo asegúrese de mantener la compatibilidad con CLR, y puede implementar en Mac y Linux a través de Mono. Un gran beneficio. XAML puede ser genial, pero no se trasladará a otros sistemas operativos.

Personalmente, encuentro aterrador el modelo de negocio de UWP de espacio aislado (¿arena rápida?); contrarresta la apertura que ha representado Windows desde el principio.


4

He trabajado con tecnologías de Microsoft durante más de 10 años. Lo más importante que aprendí es no solo escuchar lo que Microsoft te ofrece. Cuando Microsoft dice que este es el futuro, tiene un 50% de posibilidades de salir mal. Microsoft seguramente hará lo mejor que pueda para promover los productos en los que ha invertido, pero eso no significa que deba seguirlos. Vea lo que sucede con WCF y Silverlight.

Aunque WPF es una plataforma muy agradable para aprender, tiene una curva de aprendizaje enorme. No creo que ningún desarrollador con menos de 5 años de experiencia en programación pueda hacer WPF correctamente.

Siguiendo el patrón MVVM, encontrará que hacer algo relativamente fácil en WinForm puede volverse muy desafiante en WPF. Como colorear una celda en función de alguna condición después de una actualización, o desplazarse por una fila en la vista y resaltarla.

Por supuesto, puede decir que no tiene que hacer MVVM. Simplemente ponga su código en código detrás y hágalo funcionar. Sí, eso funcionará, pero ¿cuál es el punto de usar WPF? ¿Por qué no usar Win Form?


1
Estoy de acuerdo en que WPF tiene una curva de aprendizaje intensa, pero una vez que superas eso, simplemente no hay vuelta atrás a WinForms ... nunca.
Krythic

4

Este es un hilo antiguo pero importante con el progreso actual del marco .NET, las características de c # y un mayor enfoque en c # como una opción de desarrollo de juegos.

Con toda honestidad, WPF casi nunca se elige como plataforma de juego ac #. Los problemas del espacio aéreo de WPF asustaron a la gente bastante rápido. No creo que muchos (si los hay) títulos principales o motores de juegos de transmisión principal sean compatibles con WPF como plataforma de destino debido a esto. ¡Sin embargo, WPF es una gran plataforma para lanzadores de juegos!

WinForms, aunque ahora está en modo de mantenimiento, seguirá siendo una opción válida durante los próximos años. Es estable y probado en el tiempo. Por lo que he visto, incluso en 2017, WinForms sigue siendo la plataforma más común elegida para el desarrollo de juegos basado en c #.

Al observar los datos de Steam Hardware Survey , puede ver que en el momento de escribir esta respuesta (julio de 2017), Windows 10 de 64 bits es ahora la plataforma de juegos de PC dominante con una participación de mercado del 50%, seguida de Windows 7 de 64 bits con un 32% y Windows 8.1 de 64 bits a casi un 7%. La cuota de mercado de todas las demás plataformas de SO es tan pequeña que apenas vale la pena considerar otra cosa que no sean estas tres.

Siendo ese el estado actual de los juegos de PC, WinForms es el denominador más común para apuntar a las 3 principales plataformas de PC. De cara al futuro, UWP será la mejor plataforma de destino para el desarrollo de juegos de C #, ya que Windows 7 y 8 pierden una participación de mercado significativa frente a Windows 10, a menos que aparezca una nueva plataforma que la reemplace. Eso es solo por los números.

Si elige en función del mejor nivel de compatibilidad por plataforma de sistema operativo en lugar de respaldar la participación de mercado máxima, las opciones serían más como:

  • Windows 10: UWP
  • Windows 8.1: WinRT o Tienda Windows
  • Windows 7: WinForms

La mayoría de las otras respuestas se centran en el desarrollo de aplicaciones estándar de Windows, pero el desarrollo de juegos es un ámbito muy diferente y diferentes factores influirán en sus elecciones, como el sistema operativo objetivo y lo que su elección de API de gráficos o motor de juego realmente admite mejor.


Si bien tener un punto de vista sobre gamedev es interesante, no entiendo por qué elegirías un marco de GUI para gamedev en el que tienes un motor de juego con todas las funciones para C # como Unity. Solo algunos juegos que vi con GUI clásica fueron para la edición de datos del juego (como la edición de mapas / activos)
Uwy

2
Por la misma razón, eligen un motor de juego: es bastante trabajo crear y administrar una ventana nativa de manera efectiva a partir del código administrado por su cuenta.
Mike Johnson

3

WinRT ha estado en el escritorio durante mucho tiempo, estoy escribiendo WinRT, que se ejecuta en mi escritorio. Y en Windows 10, esas aplicaciones admitirán ubicaciones no acopladas (con ventanas como las conoce tradicionalmente).

No recomendaría WinForms o WPF a nadie que empiece hoy. Deben aprender principalmente sobre WinRT / XAML. Y aprenda algo de Win32 / .net según lo necesiten, según el idioma que elijan ...

"Dicen que WinRT + XAML es para la construcción de GUI de Metro (¡cosa de ventanas con 8 mosaicos!)" - Esto es una abstracción tan excesiva que es inútil. WinRT es un tiempo de ejecución, como Win32, no es solo para GUI, entonces lo que "dicen" es BS completo. XAML es una capa de interfaz de usuario (muy similar a XAML en WPF), pero decir que Metro GUI también es incorrecto, ya no existe Metro GUI. XAML es la capa de interfaz de usuario de Windows. Y "¡Lo de los mosaicos de Windows 8!" expresa la visión de túnel de ciertas personas. Sería como si dijera que Win32 es una cosa del menú de inicio. Puedes ver lo ridícula que es esa afirmación.


8
Para aclarar mi declaración original, WinRT no se puede utilizar para crear una aplicación de escritorio "tradicional". Por esa razón, entre otras, hay un montón de razones para aprender WPF (Windows Forms, no tanto). Al menos, habrá aprendido WinRT de manera efectiva al mismo tiempo (como señalo en mi respuesta). Además, no estamos ni cerca del punto de que las aplicaciones WinRT gobiernen el mercado (especialmente las aplicaciones de línea de negocios). WPF sigue siendo inmensamente valioso.
BradleyDotNET

7
Si WinRT no está vinculado a la creación de aplicaciones de pantalla completa, ¿podría decirme cómo puede utilizarlo para crear una aplicación con ventana que se ejecute en cualquier versión de Windows realmente lanzada? ¿O cómo usarlo para escribir una aplicación que se ejecute en más del 10% de las computadoras con Windows (es decir, Windows 7 y XP)? Supongo que la mayoría de los desarrolladores quieren poder dirigirse a más del 10% de los usuarios de Windows. Hasta que Windows 8 o 10 obtenga una gran cantidad de participación en el mercado, WPF seguirá siendo necesario para muchas aplicaciones. WinRT puede ser una capa en tiempo de ejecución, pero eso no cambia el hecho de que no puede acceder a muchas de las cosas que puede acceder Win32 (completo).
John Colanduoni

1
@JohnColanduoni, como dijo, para cualquiera a partir de hoy (14 de marzo) WinRT es el camino a seguir, win10 fue y es gratis como una actualización durante algunos meses, y lo será durante unos meses más, así que sí, win10 está obteniendo un enorme cuota de mercado. sí, no todos se movieron a win10, pero también hace un par de días descubrimos que un aeropuerto en Francia todavía usa win3.1
John Demetriou

3
@GavinWilliams Bien, ¿dónde están las estadísticas que sitúan a Windows 10 en una cuota de mercado apreciable en cualquier segmento del mercado? ¿Estás diciendo que los mods eliminaron tu comentario con un enlace a tu fuente, pero te dejaron publicar este? No me lo trago. Estoy de acuerdo en que no vale la pena respaldar XP, pero las aplicaciones universales de Windows 10 ni siquiera son compatibles con Windows 8.1, y mucho menos con Windows 7. La adopción no está donde debe estar para justificar Windows Universal, y se está desacelerando .
John Colanduoni

3
@GavinWilliams De acuerdo, ignoremos que el 30% es mucho menos que el 97% (el soporte que obtendría si usara WPF), y que estos datos solo son útiles para los programadores de videojuegos. Para los videojuegos, es bastante fácil apuntar a ambos; a menos que esté haciendo algo realmente trivial, querrá usar DirectX / OpenGL, lo que significa que solo necesita alojarlo en una ventana / pantalla completa. Si no desea usarlos, realmente querrá WPF ya que la interfaz de usuario de WinRT no permite el dibujo en modo inmediato sin DirectX / OpenGL alojado (como lo hace WPF). Entonces, ¿qué pasa con WinRT que justifica una reducción del 70% en el tamaño del mercado?
John Colanduoni

1

Me encontré con esta pregunta hace un año. Llegué a la conclusión de que si XAML, WPF o WinRT son el entorno de desarrollo correcto para empezar.

Recomiendo encarecidamente utilizar .Net Framework para la capa de datos (incluidos los servicios web y la capa RESTful (JSON)) y HTML5 / CSS3 puro y Javascript para su capa de presentación web.

Dentro de Windows 10 puede integrar cualquier aplicación web como una aplicación metropolitana nada más sacarlo de la caja.

WinRT, XAML, WPF y otras cosas similares de ms se ejecutan solo en Windows y tienen muchas limitaciones.

Entonces, después de un año, todavía estoy muy feliz con mi decisión de no usar WinRT o XAML para mi nuevo proyecto.


3
¿De qué estás hablando? Sí, es una excelente opción si desea crear una aplicación web. Si desea crear una aplicación de escritorio, no lo es. Podría usar Katana y tener WebApi alojado localmente y hacer una aplicación de escritorio, lo que supongo que haría que esta respuesta sea más relevante.
Casey

1
OP preguntó sobre la GUI de Windows y WPF o Winrt, no sobre aplicaciones web.
ezaspi

6
Además, personalmente encuentro esas tecnologías mucho más difíciles de trabajar (sistema de diseño incomprensible, sin verificaciones de tiempo de compilación en el código, etc.) El escritorio aún no está muerto :)
BradleyDotNET

1
Estoy de acuerdo, HTML es la interfaz de usuario universal y debería serlo también para el escritorio. Siento que debemos simplificar todos estos marcos diferentes y dejar de introducir más y más y más. La mayor parte no es necesaria. Simplemente aprenda HTML y ASP y luego aloje su sitio web en una aplicación WinForm. La aplicación WinForm contiene su servidor web y el control del navegador web. El resultado es que ahorra tiempo, se concentra en dominar un idioma y tecnología, desarrolla más rápido, ahorra dinero a sus clientes, sus aplicaciones están preparadas para el futuro y son mucho más portátiles.
TheLegendaryCopyCoder
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.