WPF vs Windows Forms


En un post anterior hablé que WPF (windows presentation foundation) es hoy en día la evolución de Windows Forms dada sus características. Sin embargo, a pesar que, ambos tienen el mismo objetivo que es la creación de interfaz gráfica para el usuario (GUI), estos poseen bastantes diferencias la una de la otra, las cuales veremos en este artículo.

Windows Forms:

Quizá es el más utilizado a la hora de crear aplicaciones de escritorio para Windows (yo mismo llevo utilizando por varios años). Podemos definir a Windows Forms como un conjunto de bibliotecas para el desarrollo de interfaces gráficas basada en los controles estándar de windows (por ejemplo el textbox) dependiente de Win32.

Ventajas:
  • Amplia documentación en Internet.
  • Permite el uso de WPF
  • Montón de ejemplos basados en Windows Forms
  • El diseñador de Visual Studio funciona más eficientemente con Windows Forms

WPF:

Permite crear aplicaciones visualmente impactantes, puesto que sus controles están basados en formato vectorial y no se pierde calidad de imagen, como asi tambien la posiblidad de incorporar diversos elementos que se mencionaran más abajo.

El lenguaje utilizado en la parte gráfica es XAML (Extensible Application Markup Language) basado en XML (Extensible Markup Language). Esto permite construir la parte gráfica en jerarquías de modelos lo cual resulta muy amigable.
Del otro lado tenemos la lógica del programa o código de programación basada en C# o Visual Basic, que llamaremos code-behind. La cual esta totalmente separada del aspecto gráfico.

Ventajas:
  • Utiliza la aceleración de hardware para la construcción GUI.
  • Diseño gráfico y lógica de programación independientes.
  • Posibilidad de trabajo en conjunto para diseñadores y programadores.
  • Soporta Windows Forms.
  • Posibilidad de enlace de datos altamente avanzados, limpia y separada del diseño.
  • Incorporar documentos fijos, componentes multitudinaria, gráficos bidemensionales y tridemencionales entre otros.
Conclusión.
La interfaz gráfica es la que el usuario final utilizará y esta más decir que no se debe descuidar por nuestra parte, puesto que el usuario da mucho valora a ella. Al usuario/cliente no le interesa si esta programado en C#, Visual Basic, etc. siempre y cuando la interfaz sea linda, amigable y funcional.


Artículos y fuentes de interés:

  • http://www.wpf-tutorial.com/about-wpf/wpf-vs-winforms/
  • https://www.infragistics.com/community/blogs/b/devtoolsguy/posts/windows-presentation-foundation-vs-winforms
  • https://msdn.microsoft.com/library/aa663364.aspx
  • https://v3nant30.wordpress.com/2012/01/29/windows-forms-o-wpf/

Crear Calculadora con WPF y C# (Segunda Parte)


Seguimos desarrollando nuestra calculadora básica que comenzamos en el post anterior (Crear Calculadora con WPF y C# (Primera Parte))

1.- A cada elemento le asignaremos un nombre para poder identificarlo correctamente. Utilizaremos x:Name="nombre" para esta asignación. Lo realizamos en el XAML:

Botones:
<!-- Botones: Números -->
        <button grid.column="0" grid.row="2" x:name="btn7">7</button>
        <button grid.column="1" grid.row="2" x:name="btn8">8</button>
        <button grid.column="2" grid.row="2" x:name="btn9">9</button>
        <button grid.column="0" grid.row="3" x:name="btn4">4</button>
        <button grid.column="1" grid.row="3" x:name="btn5">5</button>
        <button grid.column="2" grid.row="3" x:name="btn6">6</button>
        <button grid.column="0" grid.row="4" x:name="btn1">1</button>
        <button grid.column="1" grid.row="4" x:name="btn2">2</button>
        <button grid.column="2" grid.row="4" x:name="btn3">3</button>
        <button grid.column="1" grid.row="5" x:name="btn0">0</button>

        <!-- Botones: Operadores -->
        <button grid.column="3" grid.row="1" x:name="btnSumar">+</button>
        <button grid.column="3" grid.row="2" x:name="btnRestar">-</button>
        <button grid.column="3" grid.row="3" x:name="btnMultiplicar">*</button>
        <button grid.column="3" grid.row="4" x:name="btnDividir">/</button>
        <button grid.column="3" grid.row="5" x:name="btnResultado">=</button>

        <!-- Botones: Limpiadores -->
        <button grid.column="0" grid.row="1" x:name="btnCE">CE</button>
        <button grid.column="1" grid.row="1" x:name="btnC">C</button>
        <button content="&lt;=" grid.column="2" grid.row="1" x:name="btnRetroceder"></button>
        
        <!-- Boton: Positivo y Negativo -->
        <button content="+-" grid.column="0" grid.row="5" x:name="btnPositivoNegativo"></button>

TextBox:
  <!-- TextBox -->
        <TextBox x:Name="txtResultado" IsReadOnly="True" TextAlignment="Right" VerticalContentAlignment="Bottom" FontSize="40" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4">0</TextBox>

Ahora comenzaremos con la programación en C#


2.- Comenzamos a programar. Vamos a dar clic en el botón 1, En el panel de Propiedades seleccionamos el control de eventos y damos doble clic en "Clic".


3.- Creamos tres variables (para almacenar los números y la operación)

4.- En la opción Clic del botón 1 insertamos:
 private void btn1_Click(object sender, RoutedEventArgs e)
        {       
            if (operacion == "")
             {
                numero1 = (numero1 * 10) + 1;
                txtResultado.Text = numero1.ToString();
             }
            else
             {
                numero2 = (numero1 * 10) + 1;
                txtResultado.Text = numero1.ToString();
             }
       }

5.- Repetimos este proceso por cada botón numérico, hasta el momento tendríamos:
namespace Calculadora
{
    /// 
    /// Lógica de interacción para MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {

        long numero1 = 0;
        long numero2 = 0;
        string operacion = "";

        public MainWindow()
        {
            InitializeComponent();
        }


        private void btn1_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 1;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 1;
                txtResultado.Text = numero1.ToString();
            }

        }

        private void btn2_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 2;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 2;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn3_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 3;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 3;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn4_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 4;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 4;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn5_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 5;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 5;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn6_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 6;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 6;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn7_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 7;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 7;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn8_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 8;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 8;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn9_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 9;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 9;
                txtResultado.Text = numero1.ToString();
            }
        }

        private void btn0_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 0;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero1 * 10) + 0;
                txtResultado.Text = numero1.ToString();
            }
        }
    }
}

6.- Botones de operación:
private void btnSumar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "+";
            txtResultado.Text = "0";
        }

        private void btnRestar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "-";
            txtResultado.Text = "0";
        }

        private void btnMultiplicar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "*";
            txtResultado.Text = "0";
        }

        private void btnDividir_Click(object sender, RoutedEventArgs e)
        {
            operacion = "/";
            txtResultado.Text = "0";
        }

7.- Botón de resultado:
  private void btnResultado_Click(object sender, RoutedEventArgs e)
        {
            switch(operacion)
            {
                case "+":
                    txtResultado.Text = (numero1 + numero2).ToString();
                    break;
                case "-":
                    txtResultado.Text = (numero1- numero2).ToString();
                    break;
                case "*":
                    txtResultado.Text = (numero1 * numero2).ToString();
                    break;
                case "/":
                    txtResultado.Text = (numero1  / numero2).ToString();
                    break;

            }
            numero1 = 0;
            numero2 = 0;
            operacion = "";
        }

8.- Botón +-:
        private void btnPositivoNegativo_Click(object sender, RoutedEventArgs e)
        {
            txtResultado.Text = (-1 * int.Parse(txtResultado.Text)).ToString();
        }

9.- Botones de limpiar entrada
            //CE: CLEAR ENTRY
            if(operacion=="")
            {
                numero1 = 0;
            }
            else
            {
                numero2 = 0;
            }
            txtResultado.Text = "0";

        }

10.- Código de limpiar:
       
private void btnC_Click(object sender, RoutedEventArgs e)
        {
            //C: CLEAR
            numero1 = 0;
            numero2 = 0;
            operacion = "";
            txtResultado.Text = "0";

        }

11.- Botón de retroceder:
        private void btnRetroceder_Click(object sender, RoutedEventArgs e)
        {
            if(operacion=="")
            {
                numero1 = (numero1 / 10);
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 / 10);
                txtResultado.Text = numero2.ToString();
            }
        }

12.- Código completo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Calculadora
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        long numero1 = 0;
        long numero2 = 0;
        string operacion = "";

        public MainWindow()
        {
            InitializeComponent();
        }


        private void btn1_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 1;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 1;
                txtResultado.Text = numero2.ToString();
            }

        }

        private void btn2_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 2;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 2;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn3_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 3;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 3;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn4_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 4;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 4;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn5_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 5;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 5;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn6_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 6;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 6;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn7_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 7;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 7;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn8_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 8;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 8;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn9_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10) + 9;
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10) + 9;
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btn0_Click(object sender, RoutedEventArgs e)
        {
            if (operacion == "")
            {
                numero1 = (numero1 * 10);
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 * 10);
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btnSumar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "+";
            txtResultado.Text = "0";
        }

        private void btnRestar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "-";
            txtResultado.Text = "0";
        }

        private void btnMultiplicar_Click(object sender, RoutedEventArgs e)
        {
            operacion = "*";
            txtResultado.Text = "0";
        }

        private void btnDividir_Click(object sender, RoutedEventArgs e)
        {
            operacion = "/";
            txtResultado.Text = "0";
        }

        private void btnResultado_Click(object sender, RoutedEventArgs e)
        {
            switch(operacion)
            {
                case "+":
                    txtResultado.Text = (numero1 + numero2).ToString();
                    break;
                case "-":
                    txtResultado.Text = (numero1- numero2).ToString();
                    break;
                case "*":
                    txtResultado.Text = (numero1 * numero2).ToString();
                    break;
                case "/":
                    txtResultado.Text = (numero1  / numero2).ToString();
                    break;

            }
            numero1 = 0;
            numero2 = 0;
            operacion = "";
        }

        private void btnCE_Click(object sender, RoutedEventArgs e)
        {
            //CE: CLEAR ENTRY
            if(operacion=="")
            {
                numero1 = 0;
            }
            else
            {
                numero2 = 0;
            }
            txtResultado.Text = "0";

        }

        private void btnC_Click(object sender, RoutedEventArgs e)
        {
            //C: CLEAR
            numero1 = 0;
            numero2 = 0;
            operacion = "";
            txtResultado.Text = "0";

        }

        private void btnRetroceder_Click(object sender, RoutedEventArgs e)
        {
            if(operacion=="")
            {
                numero1 = (numero1 / 10);
                txtResultado.Text = numero1.ToString();
            }
            else
            {
                numero2 = (numero2 / 10);
                txtResultado.Text = numero2.ToString();
            }
        }

        private void btnPositivoNegativo_Click(object sender, RoutedEventArgs e)
        {
            txtResultado.Text = (-1 * int.Parse(txtResultado.Text)).ToString();
            // txtResultado.Text = Math.Abs(int.Parse(txtResultado.Text)).ToString();
        }
    }
}

Ahora solo queda mejorar el código y algunas funciones.

Saludos

Crear Calculadora con WPF y C# (Primera Parte)


Como ejercicio crearemos una calculadora básica en C# y WPF, con la cual trabajaremos algunos elementos básicos como:
  • Grillas/tablas/matriz de diseño
  • Insertar elementos (botones y textbox)
  • Ajustar elementos dentro de la grilla
  • Realizar una programación en C#

Antes de comenzar, diseñaremos previamente la interfaz de la calculadora, con la finalidad de tener claro los elementos.
Bajo este diseño sabremos que necesitaremos:

  • Grilla con 4 columnas y 6 filas
  • 1 Textbox donde se muestre el resultado
  • Botones números, de operación y limpiadores

Manos a la obra...
1.- Creamos un nuevo proyecto C# WPF.


2.- Cambiamos algunas propiedades del código XAML , como el Title (titulo), Height (alto) y Width (ancho)
mc:Ignorable="d"

        Title="Calculadora WPF" Height="400" Width="250">
3.- Creamos las 4 columnas.
          <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
          </Grid.ColumnDefinitions>

4.- Creamos las 6 filas
<Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        
Deberíamos tener esto

5.- Creamos todos los botones. Creamos una grilla de 4 columnas X 6 filas la que nos da un total de 24 cuadros en forma de matriz. El Grid.Row indica la posición de la fila y Grid.Column la posición de la columna. Por lo tanto el primer cuadro de la esquina superior izquierda corresponderá al Grid.Row="0" Grid.Column="0", el que esta inmediatamente bajo de este sera Grid.Row="1" Grid.Column="0".
   <!-- Botones: Números -->
        <Button Grid.Row="2" Grid.Column="0">7</Button>
        <Button Grid.Row="2" Grid.Column="1">8</Button>
        <Button Grid.Row="2" Grid.Column="2">9</Button>
        <Button Grid.Row="3" Grid.Column="0">4</Button>
        <Button Grid.Row="3" Grid.Column="1">5</Button>
        <Button Grid.Row="3" Grid.Column="2">6</Button>
        <Button Grid.Row="4" Grid.Column="0">1</Button>
        <Button Grid.Row="4" Grid.Column="1">2</Button>
        <Button Grid.Row="4" Grid.Column="2">3</Button>
        <Button Grid.Row="5" Grid.Column="1">0</Button>

        <!-- Botones: Operadores -->
        <Button Grid.Row="1" Grid.Column="3">+</Button>
        <Button Grid.Row="2" Grid.Column="3">-</Button>
        <Button Grid.Row="3" Grid.Column="3">*</Button>
        <Button Grid.Row="4" Grid.Column="3">*</Button>
        <Button Grid.Row="5" Grid.Column="3">=</Button>

        <!-- Botones: Limpiadores -->
        <Button Grid.Row="1" Grid.Column="0">CE</Button>
        <Button Grid.Row="1" Grid.Column="1">C</Button>
        <Button Grid.Row="1" Grid.Column="2" Content="&lt;="></Button>
        
        <!-- Boton: Positivo y Negativo -->
        <Button Grid.Row="5" Grid.Column="0" Content="+-"></Button>

6.- Creamos el TextBox. Este elemento tendrá la particularidad de ocupar 4 espacios en la fila, por lo tanto utilizaremos Grid.ColumnSpan="4" para abarcarlos.
<!-- TextBox -->
        <TextBox IsReadOnly="True" TextAlignment="Right" VerticalContentAlignment="Bottom" FontSize="40" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4">0</TextBox>

7.- Código completo de la parte gráfica
   <Window x:Class="Calculadora.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Calculadora"
        mc:Ignorable="d"
        Title="Calculadora WPF" Height="400" Width="250">
    <Grid>

        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        
        <!-- Botones: Números -->
        <Button Grid.Row="2" Grid.Column="0">7</Button>
        <Button Grid.Row="2" Grid.Column="1">8</Button>
        <Button Grid.Row="2" Grid.Column="2">9</Button>
        <Button Grid.Row="3" Grid.Column="0">4</Button>
        <Button Grid.Row="3" Grid.Column="1">5</Button>
        <Button Grid.Row="3" Grid.Column="2">6</Button>
        <Button Grid.Row="4" Grid.Column="0">1</Button>
        <Button Grid.Row="4" Grid.Column="1">2</Button>
        <Button Grid.Row="4" Grid.Column="2">3</Button>
        <Button Grid.Row="5" Grid.Column="1">0</Button>

        <!-- Botones: Operadores -->
        <Button Grid.Row="1" Grid.Column="3">+</Button>
        <Button Grid.Row="2" Grid.Column="3">-</Button>
        <Button Grid.Row="3" Grid.Column="3">*</Button>
        <Button Grid.Row="4" Grid.Column="3">*</Button>
        <Button Grid.Row="5" Grid.Column="3">=</Button>

        <!-- Botones: Limpiadores -->
        <Button Grid.Row="1" Grid.Column="0">CE</Button>
        <Button Grid.Row="1" Grid.Column="1">C</Button>
        <Button Grid.Row="1" Grid.Column="2" Content="&lt;="></Button>
        
        <!-- Boton: Positivo y Negativo -->
        <Button Grid.Row="5" Grid.Column="0" Content="+-"></Button>

        <!-- TextBox -->
        <TextBox IsReadOnly="True" TextAlignment="Right" VerticalContentAlignment="Bottom" FontSize="40" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4">0</TextBox>
    </Grid>
</Window>

Al Finalizar tendremos algo así:

Hasta aquí la primera parte.

¿Qué es WPF?

Windows Presentation Foundation (WPF) es una tecnología de Microsoft ofrecida a través de Visual Studio .NET, entregando un modelo de desarrollo unificado para entornos Windows. Su principal característica es poder separar el código del diseño mediante su estructura XALM, como también crear aplicaciones atractivas visualmente, utilizando el poder de aceleración 3D del hardware. Su aparición fue en la versión 3.0 de .NET Framework y se encuentra soportado desde Windows XP a Windows 10.



También podemos decir que WPF es la evolución de WindowsForms y ofrece un diseño visual basado en vectores, diferente a WindowsForms que utiliza mapa de bits para dibujar elementos en pantalla. Es decir, que en WPF podremos ampliar los elementos en pantalla sin que sufran deformación por la pixelacion.

A opinión personal es bastante cómodo  realizar proyectos en WPF gracias a la separación del diseño mediante su estructura de etiquetas en XALM (si sabes un poco de HTML te sentirás como en casa) y tener por otro lado la programación pura y dura.


Si quieren enviar pantallazos de sus aplicaciones en WPF envíenme un email a luis.subiabre@gmail.com y las incluiré. Saludos colegas.

Como hacer un "Hola Mundo" con WPF y C#


En todo lenguaje de programación es un clásico realizar el "Hola Mundo" a modo de ritual de iniciación, por ello aquí el pequeño ejemplo de este clásico Hola Mundo, realizado con WPF (Windows Presentation Foundation) y programado en C#.

Paso 1: En Visual C# creamos una nueva aplicación WPF (.NET Framework).

Creación de la nueva solución WPF con C#

Pantalla por defecto que tendremos


Paso 2: Modificamos el atributo Title, Height y Width para personalizar un poco el proyecto.


Podemos especificar cualquier valor (prueben)
Quedará algo asi

Paso 3: Insertamos un botón

Paso 4: Cambiamos los valores x:Name, Margin, Width y Heigth
<Button x:Name="btnHolaMundo" Content="Button" Margin="0,0,0,0" Width="150" Height="50" Click="btnHolaMundo_Click"/>

 Paso 5: Hacemos doble clic en el botón para poder programarlo y darle la instrucción que cada vez que se le haga un clic este muestre el mensaje "Hola Mundo"


 Paso 6: Introducimos el código para mostrar mensaje en pantalla:

 MessageBox.Show("Hola Mundo");

  Paso 7: Ahora solo queda probar.


Descargar código fuente aquí


Si quieren el ejemplo en otro lenguaje solo déjenlo en los comentarios. Saludos


Descargar e instalar Visual Studio .NET


Visual Studio es una interfaz de desarrollo que nos permite crear aplicaciones de escritorio, web y móvil, con soporte multiplataforma.  Dentro de VS encontramos varios lenguajes como por ejemplo: Visual Basic, C#, ASP.NET, Xaramin, etc.

Microsoft no entrega tres versiones: Community, Professional y Enterprise.
Nosotros descargaremos e instalaremos la versión Community que es el IDE (entorno de desarrollo integrado) gratuito con la cual podremos desarrollar nuestros proyectos.

Paso 1:

Paso 2: En la opción IDE de Visual Studio seleccionamos la opción "Community 2017"

Paso 3: Se cargará una nueva página y la descarga debería comenzar en unos instantes.


Paso 4: Damos doble clic al archivo descargado.

Paso 5: Una vez cargada la pantalla de instalación vamos a seleccionar las características que deseamos instalar  (esto depende de las necesidades de cada uno). En mi caso opte por "Desarrollo de escritorio .NET" y "Desarrollo multiplataforma .NET Core"



Nota: Otro punto importante aquí es la ubicación de instalación y el tamaño de instalación total que ocupara VS.NET en nuestro equipo. Después igual podremos añadir o quitar mas características. 

Paso 6: Una vez que tengamos todo listo, damos clic al botón "Instalar" y a esperar.



Espero que sea de utilidad y saludos a todos :)