Mostrando entradas con la etiqueta WPF. Mostrar todas las entradas
Mostrando entradas con la etiqueta WPF. Mostrar todas las entradas
on martes, 1 de octubre de 2013
Muy buen día.


Hoy les comparto un pequeño programa que te permite obtener todos tus archivos con extensión .cs de una carpeta determinada.

lo que tienes que realizar, es crear un proyecto de WPF, y en el MainWindow, tienes que remplazar el codigo tanto del code behind asi como del xaml.

aqui tenemos el xaml que tienes que pegar en tu pantalla MainWindow

<Window x:Class="viwer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="File Viewer" Height="350" Width="525">
    <Grid>
        <Button Content="Show .cs files" Height="23" HorizontalAlignment="Right" Margin="0,24,12,0" Name="btnGetFiles" VerticalAlignment="Top" Width="114" Click="btnGetFiles_Click" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="12,24,0,0" Name="txtPath" VerticalAlignment="Top" Width="359" />
        <TextBox Height="246" HorizontalAlignment="Left" Margin="12,53,0,0" Name="TxtFilesBox" VerticalAlignment="Top" Width="479" />
    </Grid>
</Window>

Y aquí tenemos el code-behind:

using System;
using System.Windows;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Documents;

namespace viwer
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnGetFiles_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                string path = txtPath.Text;

                string files = String.Empty;

                string[] listOfFiles = Directory.GetFiles(path);

                List<string> listOfNameOfFiles = new List<string>();

                foreach (var file in listOfFiles)
                {
                    FileInfo infoFile = new FileInfo(file);
                    if (infoFile.Name.Contains(".cs"))
                        listOfNameOfFiles.Add(infoFile.Name.Split('.')[0]);
                    
                }

                foreach (string file in listOfNameOfFiles)
                    files += file + "\n";

                TxtFilesBox.Text = files;
            }
            catch
            {
                MessageBox.Show("Error to try to get the files of the current path");
            }
        }
    }
}

Analicemos un poco la siguiente clase invocando a su método estático.

Directory.GetFiles(path)

La clase Directory nos permite utilizar muchas funcionalidades útiles a la hora de manipular directorios de Windows, en este caso, estamos haciendo uso del método estático GetFiles(string path).
Con este método obtendremos todos los archivos con su ruta completa.
Para poder obtener solamente el nombre del archivo, tenemos que hacer uso de otra clase llamada:

FileInfo    

Esta clase tiene una propiedad con nombre Name, es la que nosotros utilizaremos para consultar nuestros archivos “.cs”


Veamos como se ve en ejecución.



viewer
on domingo, 16 de diciembre de 2012

Que tal, buen día,  el día de hoy graficaremos un tablero de ajedrez en WPF.

1.- Crear un proyecto en WPF.


WPFChessProject - Microsoft Visual Studio (Administrador)_2012-12-08_18-24-01


2.- Crear un control de usuario para un tablero de ajedrez.


WPFChessProject - Microsoft Visual Studio (Administrador)_2012-12-08_18-18-59

Aquí les pongo el código en XAML.


<UserControl x:Class="WPFChessProject.ChessBoard"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="800" d:DesignWidth="800">
    <Grid x:Name="grdPrincipal">
        <StackPanel x:Name="stkBoard">
           
        </StackPanel>
    </Grid>
</UserControl>


Ahora construiremos nuestro tablero.

Primero que nada, lo que necesitamos es definir el color de las piezas blancas y de las piezas negras, por lo que necesitamos dos propiedades de tipo color.

public Color colorOfWhitePiece { get; set; }

public Color ColorOfBlackPiece { get; set; }

También es necesario tener el conjunto de casillas agrupadas.
public List<StackPanel> Boxs { get; set; }

Aquí las agrupamos en una lista de StackPanels que nos permitirán mostrar cualquier objeto derivado de la clase UIElement, esto con el fin de que si el proyecto crece se podrán crear controles como piezas de ajedrez para simular una partida de ajedrez.
El control StackPanel es un contenedor que nos permite tener una serie de controles derivados con el fin de hacer uso de los mismos.

En los controles de WPF, en los contenedores se cuenta con la propiedad Childrens, que es una lista de UIElement que son los objetos que se graficaran en nuestra pantalla.

Una vez que tenemos declaradas nuestras propiedades, es necesario crear e implementar un método que nos permita renderear nuestro tablero de ajedrez.


        public void RenderBoard()
        {
            StackPanel box;
            bool isWhite = true;

            for (int i = 0; i < 8; i++)
            {
                StackPanel rowBoxes = new StackPanel();
                rowBoxes.Orientation = Orientation.Horizontal;

                for (int j = 0; j < 8; j++)
                {
                    box = new StackPanel();
                    box.Width = this.Width / 8;
                    box.Height = this.Height / 8;

                    if (isWhite)
                    {
                        box.Background = new SolidColorBrush(ColorOfWhitePiece);
                        isWhite = false;
                    }
                    else
                    {
                        box.Background = new SolidColorBrush(ColorOfBlackPiece);
                        isWhite = true;
                    }

                    rowBoxes.Children.Add(box);

                    Boxs.Add(box);
                }

                if (isWhite)
                    isWhite = false;
                else
                    isWhite = true;

                this.stkBoard.Children.Add(rowBoxes);
            }
        }

En el método RenderBoard creamos dos variables locales, una variable representa una casilla de nuestro tablero de ajedrez y otra variable booleana   que nos permite saber si la casilla es color blanco o negro según el ajedrez.

StackPanel box;

bool isWhite = true;

También tenemos dos ciclos for que nos permiten recorrer el tablero de ajedrez
            for (int i = 0; i < 8; i++)
            {
                StackPanel rowBoxes = new StackPanel();
                rowBoxes.Orientation = Orientation.Horizontal;

                for (int j = 0; j < 8; j++)
                {
                    box = new StackPanel();
                    box.Width = this.Width / 8;
                    box.Height = this.Height / 8;


Las dos primeras lineas representan una fila de un tablero de ajedrez con ocho columnas

StackPanel rowBoxes = new StackPanel();
rowBoxes.Orientation = Orientation.Horizontal;


en las primeras líneas del segundo for tenemos la instancia de una casilla de ajedrez y la asignación de ancho y alto.


                    box = new StackPanel();
                    box.Width = this.Width / 8;
                    box.Height = this.Height / 8;

la condicional nos indica cuando tenemos que graficar una casilla blanca o negra


                                   if (isWhite)
                    {
                        box.Background = new SolidColorBrush(ColorOfWhitePiece);
                        isWhite = false;
                    }
                    else
                    {
                        box.Background = new SolidColorBrush(ColorOfBlackPiece);
                        isWhite = true;
                    }


        


Terminando el for de las columnas, lo que necesitamos es cambiar el color de nuestra bandera booleana que nos indica de qué color es la casilla.

Después de esto, solo basta agregar la fila de casillas a nuestra stack panel stkBoard


  if (isWhite)
                    isWhite = false;
                else
                    isWhite = true;

                this.stkBoard.Children.Add(rowBoxes);

aquí les dejo todo el codigo fuente del user control.







 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 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 WPFChessProject  
 {  
   /// <summary>  
   /// Lógica de interacción para ChessBoard.xaml  
   /// </summary>  
   public partial class ChessBoard : UserControl  
   {  
     public List<StackPanel> Boxs { get; set; }  
     public Color ColorOfWhitePiece { get; set; }  
     public Color ColorOfBlackPiece { get; set; }  
     public ChessBoard(Color pieceWhiteColor,Color pieceBlackColor,double width, double height)  
     {  
       InitializeComponent();  
       Boxs = new List<StackPanel>();  
       this.Width = width;  
       this.Height = height;  
       stkBoard.Orientation = Orientation.Vertical;  
       this.ColorOfWhitePiece = pieceWhiteColor;  
       this.ColorOfBlackPiece = pieceBlackColor;  
       RenderBoard();  
     }  
     public void RenderBoard()  
     {  
       StackPanel box;  
       bool isWhite = true;  
       for (int i = 0; i < 8; i++)  
       {  
         StackPanel rowBoxes = new StackPanel();  
         rowBoxes.Orientation = Orientation.Horizontal;  
         for (int j = 0; j < 8; j++)  
         {  
           box = new StackPanel();  
           box.Width = this.Width / 8;  
           box.Height = this.Height / 8;  
           if (isWhite)  
           {  
             box.Background = new SolidColorBrush(ColorOfWhitePiece);  
             isWhite = false;  
           }  
           else  
           {  
             box.Background = new SolidColorBrush(ColorOfBlackPiece);  
             isWhite = true;  
           }  
           rowBoxes.Children.Add(box);  
           Boxs.Add(box);  
         }  
         if (isWhite)  
           isWhite = false;  
         else  
           isWhite = true;  
         this.stkBoard.Children.Add(rowBoxes);  
       }  
     }  
   }  
 }  



3.- Consumir el Control de usuario.

ahora en nuestra aplicación principal del proyecto tendremos que instanciar nuestro tablero, les muestro el XAML de la aplicación principal.


 <Window x:Class="WPFChessProject.MainWindow"  
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
     Title="MainWindow" Height="350" Width="525">  
   <Grid x:Name="grdPrincipal">  
   </Grid>  
 </Window>  


Ahora veamos el codebehind:

 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 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 WPFChessProject  
 {  
   /// <summary>  
   /// Lógica de interacción para MainWindow.xaml  
   /// </summary>  
   public partial class MainWindow : Window  
   {  
     public MainWindow()  
     {  
       InitializeComponent();  
       ChessBoard chessBoard = new ChessBoard(Colors.Green, Colors.Black,400,400);  
       grdPrincipal.Children.Add(chessBoard);  
     }  
   }  
 }  


Básicamente consiste en crear una instancia de ChessBoard y agregarlo al gridPrincipal y listo.



4.- Ejecutar la aplicación.:


MainWindow_2012-12-08_19-57-32


Y así lucirá nuestro tablero de ajedrez ;)

Que pasen buen día, buena vibra