Buscar

Ingphillip's-Prog

TODO: WEB!!!

Fundamentos de Programación Orientada a Objetos desde Silverlight – Level 100


CAPITULO 1

  1. Clases y Objetos 01.
  2. Clases y Objetos 02.
  3. Clases y Objetos 03.
  4. Clases y Objetos 04.

CAPITULO 2

  1. Herencia 05.
  2. Clases abstractas 06.
  3. Interfaces 07.

CAPITULO 3

  1. Modificadores de ámbito 08.
  2. Encapsulamiento 09.
  3. Polimorfismo 10
Entrada destacada

Mini: Silverlight – Deshabilitar el zoom del browser


Para poder deshabilitar el efecto de zoom que traen los browsers por ejemplo cuando se manipula el scroll del mouse y simultáneamente se oprime la tecla ctrl se ve que el contenido se hace más grande o menos visible según se quiera, es posible desactivar dicho efecto de la siguiente forma:

1- Es importante comprender que Silverlight corriendo en el browser es un plug-in osea algo que no es nativo  al estándar que maneja el browser(HTML), por lo tanto es importante conocer que para hospedar un objeto de Silverlight en el browser es necesario crear un tag object de html, el cual me permite exponer por ejemplo dicho  plug-in  como en este caso, así:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
  <param name="source" value="ClientBin/ZoomDisabled.xap"/>
  <param name="onError" value="onSilverlightError" />
  <param name="background" value="white" />
  <param name="minRuntimeVersion" value="4.0.50826.0" />
  <param name="autoUpgrade" value="true" />
 </object>

2-) Observese que a través de este tag podemos parametrizar propiedades para el plug-in, dentro de muchas otras, para lograr deshabilitar el zoom se debe agregar el siguiente tag param y establecer su valor en false, de esta forma el  zoom ya no tendrá efecto en ningún browser.

<param name="enableautozoom" value="false" />

Saludos!

Entrada destacada

Creando una aplicación para Twitter con Silverlight y WCF – (TweetRobot) @DotNeteros


Un RSS consiste en una fuente de datos en formato xml  usada para presentar noticias o información actualizada de un tema en específico.

Hoy día Twitter está minado de un sin fin  de Robots que hacen este tipo de actualizaciones, bien sea periódicamente o automáticamente.  Hasta cierto punto es bueno tener un motor dedicado a este tipo de trabajo y no tener nosotros que convertirnos en ese Robot! dedicando nuestros días a copiar y pegar links, que siendo muchos de estos provechosos, es una tarea que toma bastante tiempo y sacrificio, entonces, si lo que quieres es compartir fuentes de datos esta podría ser una solución :D!

Indice

  1. Crear una aplicación en Twitter en tan solo segundos.
  2. API para hacer update TwitterStatus.
  3. Creación de UI con Silverlight para nuestro TweetRobot (ListBox – ItemTemplate).
  4. IsolatedStorage en Silverlight (Manejo de archivos XML)
  5. Creación y configuración  de un servicio WCF  para comunicación con TweetRobot.
  6. Helpers y Componentes para implementar funcionalidad de Tweets.
  7. Depurando código TweetRobot.
Una de las cosas requisito para el desarrollo de este tutorial es tener una cuenta de Twitter :/, espero la tengas, de lo contrario deberias crearla, demora tan solo segundos, bueno y de paso me das el Follow ;), bueno continuando.

 

Crear una aplicación en Twitter en tan solo segundos

 

Lo primero que debemos hacer es ir al siguiente link, acá vamos a hace el login con la cuenta propia (Si no quieres causar molestias a gente escasa de paciencia :D, debes crear una nueva cuenta para este ejercicio). Ya en el portal para desarrolladores.

Como se ve,  hay una opción que se llama My Applications, allí podremos crear lo que pronto se va a convertir en nuestra primer aplicación para Twiiter. Oprimimos el botón crear aplicación.

 

 

Validamos el captcha y aceptamos los terminos,

 

 

Y como se ve en pantalla la aplicación se habrá creado en forma correcta.

 

Páginas: 1 2 3 4 5

Entrada destacada

[WebCast] Tip Debugging Visual Studio


Hola en este post quiero presentar  las instrucciones #if  y #endif  “DEBUG” y cómo permiten  potencializar el debug en nuestras aplicaciones .NET (ASP.NET, WPF, Silverlight etc) construidas con Visual Studio 2010

Veamos el video.

Espero sea les guste. Saludos!

Entrada destacada

¿Cómo conectar .NET y ORACLE?


Un saludo.

En esta ocasión desarrollaremos un aplicativo sencillo, el cuál nos permita lograr conectar una base de datos ORACLE desde .NET, más precisamente la base de datos Oracle Express Edition.

Seguir leyendo “¿Cómo conectar .NET y ORACLE?”

Entrada destacada

SQL injection el riesgo de SQL Dinámico


Hola a todos, en esta oportunidad quiero compartirles un tema el cual constituye una vulnerabilidad en un sistema de gestión de datos, usando en este caso SQL Server cómo motor de bases de datos.

Muchas veces por comodidad y facilidad solemos usar SQL Dinámico, el cual básicamente consiste en flexibilizar una consulta sobre la base de datos, ¿por qué razón?, por ejemplo  imaginemos un formulario de ASP.NET en el cual tengamos filtros tales cómo podrían ser  fechas, descripción de un dato u otro valor que se desea filtrar, digamos que tenemos un control  el cual permita una funcionalidad similar a la que podemos encontrar en el buscador google (Control tipo AJAX para encontrar coincidencias por ejemplo en una BD para nuestro caso).

Ejemplo Formulario:

ASPX AJAX xon JQUERY ver post anterior

<pre><%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
    <script type="text/javascript" language="javascript" src="Scripts/jquery-1.4.1.min.js"></script>
    <script type="text/javascript" language="javascript">
        $(document).ready(function () {
            $("#<%=TxtBusqueda.ClientID%>").keyup(function () {
                $.ajax({
                    type: "POST",
                    url: "Default.aspx/GetData",
                    dataType: "json",
                    contentType: "application/json; chartset=utf-8",
                    data: '{ "filter":"' + $(this).val() + '"}',
                    success: function (result) {
                        if (!result)
                            return;
                        if (!result.d)
                            return;
                        $("#DivResults").html("");
                        var table = $('<table></table>');
                        table.append($("<tr><td>Id</td><td>Nombre</td><td>Apellido</td></tr>"));
                        $(result.d).each(function () {
                            table.append($('<tr>' +
                                '<td>' + this.ContactID + '</td>' +
                                '<td>' + this.FirstName + '</td>' +
                                '<td>' + this.LastName + '</td>' +
                            '</tr>'));
                        });
                        $("#DivResults").append(table);
                    },
                    error: function (XmlError, error, desc) { },
                    async: true
                });
            });
        });
    </script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">

    <br />
    <table>
        <tr>
            <td>
                Descripción Producto
            </td>
            <td>
                <asp:TextBox ID="TxtBusqueda" Width="500px" runat="server"></asp:TextBox>
            </td>
        </tr>
    </table>
    <br />
    <div style="background:black; width:50%;">
        <span style="color:White">Resultados : </span>
        <br />
        <div id="DivResults">

        </div>
    </div>
</asp:Content></pre>

CodeBehind: Podemos ver cómo creamos una conexión a la base de datos, y como devolvemos los datos transformados a un objeto List<T>

<pre>using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using System.Data;
using System.Data.SqlClient;
namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        [WebMethod]
        public static List<Result> GetData(string filter)
        {
            DataTable dt = new DataTable();
            List<Result> listResults = new List<Result>();
            using (SqlConnection connection = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["AdventureWorksConnectionString"].ConnectionString))
            {
                using (SqlCommand cmd = new SqlCommand("Person.AWProcDinamico", connection))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@Descripcion", filter);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    try
                    {
                        connection.Open();
                        da.Fill(dt);
                    }
                    catch (SqlException ex)
                    {
                        throw ex;
                    }
                }
            }
            //Para ver una mejor forma de hacer esta parte: https://ingphillip.wordpress.com/2011/04/09/generics-t-anonymous-types-system-reflection-y-metodos-extensores-en-net/
            foreach (DataRow dRow in dt.Rows)
            {
                listResults.Add(
                    new Result
                    {
                        ContactID = dRow["ContactID"].ToString(),
                        FirstName = dRow["FirstName"].ToString(),
                        LastName = dRow["LastName"].ToString()
                    }
                );
            }
            return listResults;
        }
        public class Result
        {
            public string ContactID { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }
    }
}</pre>

AHORA SUPONGAMOS:

En la base de datos AdventureWork (que en realidad puede ser una base de datos en producción con datos sensibles) creamos un “StoreProcedure dinámico para hacer un select,  en este caso un select like ” así:

	USE AdventureWorks
	GO
	ALTER PROC Person.AWProcDinamico
		@Descripcion varchar(100)
	AS
	BEGIN
		DECLARE @SQL VARCHAR(MAX)
		SET @SQL = ''
		SET @SQL = @SQL + 'SELECT Person.Contact.ContactID, Person.Contact.FirstName, Person.Contact.LastName '
		SET @SQL = @SQL + 'FROM Person.Contact WHERE FirstName Like ''%'+ @Descripcion + '%''  '
		SET @SQL = @SQL + 'ORDER BY Person.Contact.ContactID, Person.Contact.FirstName, Person.Contact.LastName'
		PRINT (@SQL)
		EXEC (@SQL)
	END
	GO

Hasta acá sólo se intentó un caso probable en el mundo real. Ahora bien si sabes que es un store procedure y cómo poderlo ejecutar desde .NET entonces entenderás que allí hemos abierto una muy sensible puerta  a los datos residentes en la base de datos.

Veamos este video de lo que es un hacking muy simple pero instructivo acerca de lo que no debemos hacer en la base con nuestra presida base de datos.

Como vimos en el video, aunque no evidente la base de datos está vulnerable, por tal razón luego de conocer el nombre de las tablas, podemos pasar a hacer cualquier tipo de consultas o updates o más grave aun deletes sobre los registros.

Cosas a tener en cuenta.

– No quemes cadenas de conexión en el Web Config,  Encriptalas!. (Te gustaría ver el artículo ?)

– No dejes abierto determinado usuario ‘sa’ u otro con permisos para manipular tablas como en nuestro caso sys.Tables

– Trata de no usar SQL dinámico en lo posible, si lo requieres, asegúrate de tener un filtro de cráteres especiales y además puedes seguir esta guía: http://msdn.microsoft.com/es-es/library/bb669091.aspx.

– Valida tanto en el cliente, cómo en el Servidor!

Saludos, espero sea de utilidad!!!

Entrada destacada

ASP.NET JQuery AJAX a Static Page WebMethods, ASMX y WCF


Hola, en esta oportunidad quiero compartir con ustedes la forma en que JQuery nos permite implementar llamados asíncronos al servidor desde un WebForm en ASP.NET . Lo primero que debemos saber es ¿Cómo empezar con JQuery? luego sabiendo esto, podemos empezar a explicar este proceso.

Seguir leyendo “ASP.NET JQuery AJAX a Static Page WebMethods, ASMX y WCF”

Entrada destacada

Fundamentos de Jquery en ASP.NET


En Visual Studio 2010 la gente de Readmon integró Jquery en las plantillas de proyectos de ASP.NET y ASP.NET MVC y adoptan Jquery cómo una Librería javascript de alta eficiencia y flexibilidad para desarrollo web. En las  versiones anteriores a Visual Studio 2010, es decir 2008,  2005, es muy fácil agregar esta librería.

Existen muchos problemas que surgen al usar jquery entre estos:

Seguir leyendo “Fundamentos de Jquery en ASP.NET”

Entrada destacada

Recetas en ASP.NET


Serie de post enfocados a ASP.NET:

1  Mini:Ejecutar sentencia select a SQL Server desde .NET

2 Mini:Debugging CodeBehind y JavaScript ASP.NET

3 Mini: Cómo exportar GridView a Excel? ASP.NET 

4 Mini: Cómo limpiar los controles de una página ASPX? ASP.NET 

Enlace a datos GridView Code-Behind C# 3 Capas ASP.NET

Enlace a datos GridView con Visual Studio Designer ASP.NET

6 Acceso Asíncrono en ASP.NET con ASP.NET AJAX Library  y WCF Service. ASP.NET

7 Todo en uno GridView!!

8 JQuery y ASP.NET Fundamentos

9 ASP.NET AJAX JQuery, WCF, ASMX, StaticWebMethods

10 SQL Injection y ASP.NET

11 CascadingDropDownList JQuery y ASP.NET 

12  Comunicación entre WebForms en ASP.NET

13 Envío de e-mail con ASP.NET y C#

14 Detección de vista de compatibilidad en  IE y otros Exploradores ASP.NET

15 WebMethods y el objeto ScriptManager
continua…

Entrada destacada

Enlace a datos GridView Code-Behind C# 3 Capas ASP.NET 2-n


En este post vamos a estudiar el enlace a datos de el objeto GridView por medio de código de Servidor C#.

Vamos a hablar en primer lugar sobre cómo se puede  manipular en código las operaciones de inserción, actualización, eliminación y consulta de datos con un objeto GridView. El más importate de todos es cómo hacer el binding de la carga inicial de datos al objeto GridView y manejo de eventos relativos a las operaciones anteriormente mecionadas, veamos el siguinete Scribd para resumir en el código cómo se debe hacer esto.

Seguir leyendo “Enlace a datos GridView Code-Behind C# 3 Capas ASP.NET 2-n”

Entrada destacada

Enlace a datos GridView con Visual Studio Designer ASP.NET


Hola desarrolladores! en esta oportunidad empezamos con un tutotial en el que afrontaremos operaciones de acceso a datos usando el objeto GridView.

Para empezar miremos las herramientas que necesitamos.

– SQL Server Management Studio
– Visual Studio Web Developer Express 2010

Seguir leyendo “Enlace a datos GridView con Visual Studio Designer ASP.NET”

Entrada destacada

Generics T Anonymous Types, System.Reflection y métodos Extensores en .NET


Hola!

A todos aquellos para los cuales la tecnología es una pasión, el presente Post
esta dedicado a System.Reflection, métodos extensores,
Generics <T> Tipos Anónimos en .NET
los cuales permiten
extender objetos de .NET framework y los objetos propios existententes en el
contexto dentro de nuestras aplicaciones.
Seguir leyendo “Generics T Anonymous Types, System.Reflection y métodos Extensores en .NET”

Páginas: 1 2

Entrada destacada

Custom Control Silverlight


Hola en esta serie de videos vamos a ver los pasos básicos para crear controles personalizados los cuales permiten brindar experiencia de usuario y permitir funcionalidad específica para alguna tarea.

Seguir leyendo “Custom Control Silverlight”

Entrada destacada

XML.Linq y Silverlight Leyendo Twiiter


Hola en este video podremos ver lo que es un lector de noticias en Silverlight espero les guste.

S4lu2….

Entrada destacada

Drag & Drop – OpenFileDialog Galería de Imagenes en Silverlight


Silverlight => {

Coding = “Beautiful Application”

};

Quisiera compartir un nuevo post relacionado con drag and drop, openfiledialog, metodos anónimos y layout en nuestras aplicaciones Silverlight. A través de una aplicación demostraremos el poder de Silverlight con el manejo de imágenes. A medida que avanza el video profundizamos en temáticas referentes a la clase de paneles que nos permite declarar el XAML  muy fácilmente.
Seguir leyendo “Drag & Drop – OpenFileDialog Galería de Imagenes en Silverlight”

Entrada destacada

Binding-INotifyPropertyChanged-IDataErrorInfo


Fundamentos Silverlight!!


Nuevamente estoy con ustedes compartiendo un tema de los fundamentales en Silverlight. El binding es uno de los pilares para el desarrollador de aplicaciones Silverlight, tiene 3 formas:

Seguir leyendo “Binding-INotifyPropertyChanged-IDataErrorInfo”

Entrada destacada

Problemas con Silverlight WCF RIA Services – Solución System.diagnostics


Bienvenidos!!!

“Soy nuevo en esto de los blogs!!! Y los post pero aquí llegue con un post que me parece, no es la solución más asombrosa o increíble, pero en su momento me tomo algo de tiempo(2 weeks) :D… ya se que para muchos esto es un juego pero para otros no :-P.”

Seguir leyendo “Problemas con Silverlight WCF RIA Services – Solución System.diagnostics”

Páginas: 1 2 3

Entrada destacada

Buenas nuevas :)!


Gracias por su apoyo con este blog, les pido me ayuden con esta pequeña contribución. Me preocupa el mundo. Quiero compartirles un sueño.

Nuevo Sitio!

Gracias, gracias y gracias!

 

Feliz 2012!!


Los duendes de las estadísticas de WordPress.com prepararon un informe sobre el año 2012 de este blog.

Aquí hay un extracto:

4,329 films were submitted to the 2012 Cannes Film Festival. This blog had 39.000 views in 2012. If each view were a film, this blog would power 9 Film Festivals

Haz click para ver el reporte completo.

Sobreponer html sobre plug-in de Silverlight!


Hola, amigos me reporto en el blog.

En esta entrada quiero veamos un tema que no es muy cómo a la hora de embeber un plug-in en las páginas ASPX.

Supongamos que en una página de asp.net, tenemos algún tipo de Menu muy sencillo, el cuál debe sobreponerse a todo el contenido de la página (html resultante de la ejecución de una página web aspx), este trabajo se logra con CSS básico, a través de la propiedad z-index, la cual permite sobreponer objetos html unos sobre otros, pero cuando se trabaja con un objeto de Silverlight el problema toma otra proporción.

Lo primero es crear un proyecto de Silverlight en Visual Studio 2010

Veamos, tengo el siguiente código de un Menu de ASP.NET con su respectivo CSS


<style type="text/css">
  #logo
        {
            float: left;
            width: 10.5em;
            background: #CCCCCC;
            padding: 0.5em 0.5em 0.5em 1em;
            margin: 0;
        }
        .primaryStaticMenu
        {
            background-color: transparent;
            float: right;
        }
        .primaryStaticMenuItem
        {
            width: 10em;
            background-color: #f7f2ea;
            border-width: 1px;
            border-color: #efefef #aaab9c #ccc #efefef;
            border-style: solid;
            color: #777777;
            padding: 0.5em 0 0.5em 1em;
        }
        .primaryStaticHover
        {
            color: #800000;
            background: #f0e7d7;
        }
        
        .primaryDynamicMenu
        {
            background-color: #f7f2ea;
            border-bottom: solid 1px #ccc;
        }
        .primaryDynamicMenuItem
        {
            width: 10em;
            background-color: #f7f2ea;
            color: #777;
            padding: 0.5em 0 0.5em 1em;
            border-width: 1px;
            border-color: #f7f2ea #aaab9c #f7f2ea #efefef;
            border-style: solid;
        }
        .primaryDynamicHover
        {
            color: #800000;
            background: #f0e7d7;
        }
        
        .secondaryLevelOne
        {
            background-color: transparent;
            background-repeat: repeat-x;
            margin: 1.5em 0 0 0;
            padding: 5px 0 0 5px;
            width: 12em;
            height: 35px;
        }
        .secondaryLevelTwo
        {
            background: #FAFBFB;
            padding: 5px 0 5px 5px;
        }
        .secondaryStaticHover
        {
            color: #800000;
        }
</style>

<div id="container">
        <asp:Menu ID="menuPrimary" runat="server" DataSourceID="siteSource1" Orientation="Horizontal"
            StaticEnableDefaultPopOutImage="false" StaticDisplayLevels="1" MaximumDynamicDisplayLevels="1">
            <StaticMenuStyle CssClass="primaryStaticMenu" />
            <StaticMenuItemStyle CssClass="primaryStaticMenuItem" />
            <StaticHoverStyle CssClass="primaryStaticHover" />
            <DynamicMenuStyle CssClass="primaryDynamicMenu" />
            <DynamicMenuItemStyle CssClass="primaryDynamicMenuItem" />
            <DynamicHoverStyle CssClass="primaryDynamicHover" />
        </asp:Menu>
    </div>
    <asp:SiteMapDataSource ID="siteSource1" runat="server" ShowStartingNode="false" />

Control de Silverlight

<UserControl x:Class="ZInexProblem.MainPage"
    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"
    mc:Ignorable="d"
    d:DesignHeight="50" d:DesignWidth="200" HorizontalAlignment="Left"  >

    <Grid x:Name="LayoutRoot" Background="White">
        <TextBox Foreground="Red" Background="Yellow" TextWrapping="Wrap" HorizontalContentAlignment="Center" FontSize="20" FontFamily="Comic Sans MS" Text="TextBox Especial"></TextBox>
    </Grid>
</UserControl>

Así creamos un control TextBox de Silverlight muy sencillo para hacer las pruebas.

De esta forma el problema consiste en que el plug-in de Silvelright por defecto se va a sobreponer a cualquier tipo de contenido que se cree en la página ASPX, es decir, en este caso el control menu va a quedar solapado bajo la película de silverlight, lo cual nos indicaría un bug(El cual no existe :).

Para solucionar esto debemos hacer lo siguiente:

Como ya algunos sabemos un plug-in de silverlight se carga y referencia a través de un tag object de html.

    <div id="silverlightControlHost">
        <object data="data:application/x-silverlight-2," type="application/x-silverlight-2">
            <param name="source" value="ClientBin/ZInexProblem.xap" />
            <param name="onError" value="onSilverlightError" />
            <param name="background" value="white" />
            <param name="minRuntimeVersion" value="3.0.40818.0" />

            <param name="autoUpgrade" value="true" />
            <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40818.0" style="text-decoration: none">
                <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight"
                    style="border-style: none" />
            </a>
        </object>
        <iframe id="_sl_historyFrame" style="visibility: hidden; height: 0px; width: 0px;
            border: 0px"></iframe>
    </div>

Bien la primer impresión que nos llevamos luego de ejecutar la aplicación es la siguiente:

Para solucionar este inconveniente, es necesario agregar al tag object de html el atributo.

<param name="windowless" value="true" />

Esto permite que de cierta forma el plug-in se integre con el DOM de html, y así podamos a través del manejo de las propiedades zindex indicar que capa asumira la película respecto al div contendor del objeto menu.

Veamos el código completo de la página ASPX:

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>ZInexProblem</title>
    <style type="text/css">
        html, body
        {
            height: 100%;
            overflow: auto;
        }
        body
        {
            padding: 0;
            margin: 0;
        }
        #silverlightControlHost
        {
            text-align: left;
            z-index: 0;
        }
        #logo
        {
            float: left;
            width: 10.5em;
            background: #CCCCCC;
            padding: 0.5em 0.5em 0.5em 1em;
            margin: 0;
        }
        .primaryStaticMenu
        {
            background-color: transparent;
            float: right;
        }
        .primaryStaticMenuItem
        {
            width: 10em;
            background-color: #f7f2ea;
            border-width: 1px;
            border-color: #efefef #aaab9c #ccc #efefef;
            border-style: solid;
            color: #777777;
            padding: 0.5em 0 0.5em 1em;
        }
        .primaryStaticHover
        {
            color: #800000;
            background: #f0e7d7;
        }
        
        .primaryDynamicMenu
        {
            background-color: #f7f2ea;
            border-bottom: solid 1px #ccc;
        }
        .primaryDynamicMenuItem
        {
            width: 10em;
            background-color: #f7f2ea;
            color: #777;
            padding: 0.5em 0 0.5em 1em;
            border-width: 1px;
            border-color: #f7f2ea #aaab9c #f7f2ea #efefef;
            border-style: solid;
        }
        .primaryDynamicHover
        {
            color: #800000;
            background: #f0e7d7;
        }
        
        .secondaryLevelOne
        {
            background-color: transparent;
            background-repeat: repeat-x;
            margin: 1.5em 0 0 0;
            padding: 5px 0 0 5px;
            width: 12em;
            height: 35px;
        }
        .secondaryLevelTwo
        {
            background: #FAFBFB;
            padding: 5px 0 5px 5px;
        }
        .secondaryStaticHover
        {
            color: #800000;
        }
    </style>
    <script type="text/javascript" src="Silverlight.js"></script>
    <script type="text/javascript">
        function onSilverlightError(sender, args) {
            var appSource = "";
            if (sender != null && sender != 0) {
                appSource = sender.getHost().Source;
            }

            var errorType = args.ErrorType;
            var iErrorCode = args.ErrorCode;

            if (errorType == "ImageError" || errorType == "MediaError") {
                return;
            }

            var errMsg = "Unhandled Error in Silverlight Application " + appSource + "\n";

            errMsg += "Code: " + iErrorCode + "    \n";
            errMsg += "Category: " + errorType + "       \n";
            errMsg += "Message: " + args.ErrorMessage + "     \n";

            if (errorType == "ParserError") {
                errMsg += "File: " + args.xamlFile + "     \n";
                errMsg += "Line: " + args.lineNumber + "     \n";
                errMsg += "Position: " + args.charPosition + "     \n";
            }
            else if (errorType == "RuntimeError") {
                if (args.lineNumber != 0) {
                    errMsg += "Line: " + args.lineNumber + "     \n";
                    errMsg += "Position: " + args.charPosition + "     \n";
                }
                errMsg += "MethodName: " + args.methodName + "     \n";
            }

            throw new Error(errMsg);
        }
    </script>
</head>
<body>
    <form id="form1" runat="server" style="height: 100%">
    <div id="container">
        <asp:Menu ID="menuPrimary" runat="server" DataSourceID="siteSource1" Orientation="Horizontal"
            StaticEnableDefaultPopOutImage="false" StaticDisplayLevels="1" MaximumDynamicDisplayLevels="1">
            <StaticMenuStyle CssClass="primaryStaticMenu" />
            <StaticMenuItemStyle CssClass="primaryStaticMenuItem" />
            <StaticHoverStyle CssClass="primaryStaticHover" />
            <DynamicMenuStyle CssClass="primaryDynamicMenu" />
            <DynamicMenuItemStyle CssClass="primaryDynamicMenuItem" />
            <DynamicHoverStyle CssClass="primaryDynamicHover" />
        </asp:Menu>
    </div>
    <asp:SiteMapDataSource ID="siteSource1" runat="server" ShowStartingNode="false" />
    <div id="silverlightControlHost">
        <object data="data:application/x-silverlight-2," type="application/x-silverlight-2">
            <param name="source" value="ClientBin/ZInexProblem.xap" />
            <param name="onError" value="onSilverlightError" />
            <param name="background" value="white" />
            <param name="minRuntimeVersion" value="3.0.40818.0" />
            <param name="windowless" value="true" />
            <param name="autoUpgrade" value="true" />
            <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40818.0" style="text-decoration: none">
                <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight"
                    style="border-style: none" />
            </a>
        </object>
        <iframe id="_sl_historyFrame" style="visibility: hidden; height: 0px; width: 0px;
            border: 0px"></iframe>
    </div>
    </form>
</body>
</html>

Archivo XML web.sitemap para la fuente de los items del menú.

<?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

  <siteMapNode title="Home" description="Home Page" url="Default.aspx">
    <siteMapNode title="News" description="The Latest News" url="News.aspx">
      <siteMapNode title="U.S." description="U.S. News" url="News.aspx?cat=us" />
      <siteMapNode title="World" description="World News" url="News.aspx?cat=world" />
      <siteMapNode title="Technology" description="Technology News" url="News.aspx?cat=tech" />
      <siteMapNode title="Sports" description="Sports News" url="News.aspx?cat=sport" />
    </siteMapNode>
    <siteMapNode title="Weather" description="The Latest Weather" url="Weather.aspx" />
  </siteMapNode>
</siteMap>

El resultado final es:

Codigo Link Código

CPOO en Silverlight – Polimorfismo 10


El polimorfismo es nuestro último tema en esta serie de POST para el tutorial de fundamentos de Programación Orientada a Objetos abordada desde Silverlight.

A lo largo de estos post, ya se habrá sugerido de forma abstracta el uso de polimorfismo, pero aquí en este punto es donde se establece su definición y uso.

DEFINAMOS

El polimorfismo, es la capacidad que se tiene en POO para, a partir de una definición base sea posible crear diferentes tipos de comportamiento para un grupo de clases que implementen dicha definición.

Por ejemplo, se tiene la clase Figura y las clases Triangulo, Cuadrado y Circulo y se plantea el requerimiento de calcular el área par a cada figura, en sí el proceso se llama CalcularArea, pero sera la obligación de cada figura generar el código necesario para realizar dicho cálculo.

Veamos el diagrama del clases para el ejemplo:

Como se ve, las clases concretas están implementando la interface IFiguraAreaCalculable, en donde se define un método que apunta a ser de tipo polimorfico, debido a que las clases que implementen esta interface, se someten a generar el código necesario que permita calcular el área correspondiente a cada una de las figuras.

CPOO en Silverlight – Encapsulamiento – 09


En este post se concreta el concepto de Encapsulamiento, pues hasta el momento se habría usado mucho en el recorrido de cada uno de los POST, pero no se había definido un espacio para aclarar este concepro, ¿Por qué asta estas instancias hablar un tema tan importante? Cuando al principio se aborda el tema de encapsulamiento sin haber tenido contacto con términos y conceptos de POO es más tortuoso entender su significado. Luego de estudiar, qué es Clase, Objeto, Propiedades, Comportamientos, Métodos, Estados, Interfaces, Clases Abstractas etc, se puede tener una visión más general sobre el tema.

DEFINAMOS

Encapsulamiento o encapsulación es todo comportamiento, operación o estado interno de un objeto, que para otros objetos o su exterior no es ni relevante ni necesario conocer.

Por ejemplo para aplicaciones silverlight existe el Toolkit de Silverlight que a la hora de crear aplicaciones, permite usar componetes tales como cajas de texto, selectores y otros muchos más controles que permiten crear interfaces de usuario eficientes, compactas e interactivas.

Para ver ejemplos a cerca del uso de estos controles puedes dirigirte al siguiente link.

Ahora es posible afirmar que: El Toolkit de Silverlight encapsula componentes orientados a objetos, los cuales permiten crear y mejorar la experiencia del usuario.

PRACTIQUEMOS

A través de un ejemplo con Silverlight vamos a poner a prueba el poder del encapsulamiento.

1- En una solución de Silverlight en el archivo MainPage.xaml, se va a crear un objeto Ellipse tal cómo se ve en el siguiente código:

<Ellipse x:Name="Balon" Width="50" Height="50" Fill="Black"/>

La idea inicial es poder lograr un efecto de balón con este objeto tipo Shape de Silverlight.

2 – Crearemos 2 botones en la ventana, de forma tal me permitan interactuar con los eventos Click para iniciar y parar la animación.

 <Button Canvas.Left="179" Canvas.Top="265" Content="Empezar"
         Height="23" Name="BtEmpezar" Width="75" Click="BtEmpezar_Click" />
<Button Canvas.Left="270" Canvas.Top="265" Content="Parar"
        Height="23" Name="BtParar" Width="75" Click="BtParar_Click" />

Cada uno de los anteriores objetos con un controlador de evento asociado.

3 – El contenedor principal para este ejemplo sea un Panel tipo canvas, en el cual se va a definir de forma especial un recurso el cual se usaría para lograr el efecto de la animación:

<Canvas x:Name="LayoutRoot" Background="White">
        <Canvas.Resources>
            <Storyboard x:Name="SBAnimacion">
                <DoubleAnimation Storyboard.TargetName="Balon" RepeatBehavior="Forever"
                                 Storyboard.TargetProperty="(Canvas.Top)"
                                 From="0" To="250" Duration="00:00:05">
                    <DoubleAnimation.EasingFunction>
                        <BounceEase Bounces="2" EasingMode="EaseOut" Bounciness="3"/>
                    </DoubleAnimation.EasingFunction>
                </DoubleAnimation>
            </Storyboard>
        </Canvas.Resources>
</canvas>

Como se ve en el anterior código se ha creado un objeto StoryBoard como recurso del objeto Canvas, este objeto el cual llamaremos SBAnimacion va a contener un objeto de tipo animación que permite definir una interacción o comportamiento del Objeto Balon y Propiedad Top de este, en este caso el tipo de animación será DoubleAnimation, en la cual se configuran los parámetros de dicha animación. Incluido en el código y dentro del objeto DoubleAnimation existe una Propiedad especial, llamada EasingFunction, en el cual se definen unos atributos más, respecto a la animación que se está haciendo, y con el objetivo de obtener el efecto de rebote para el balón(funciones matemáticas de comportamiento para los objetos de la UI en Silverlight).

Cómo se ve hasta este punto no se le ha hecho nada más si no mediante código XAML parametrizar cada objeto respecto a lo que se quiere hacer al momento de ejecutar la animación.

Si vemos el código completo XAML quedará así:

<UserControl x:Class="Silverlight_CPOO_03_Encapsulamiento.MainPage"
    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"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Canvas x:Name="LayoutRoot" Background="White">
        <Canvas.Resources>
            <Storyboard x:Name="SBAnimation">
                <DoubleAnimation Storyboard.TargetName="Balon" RepeatBehavior="Forever"
                                 Storyboard.TargetProperty="(Canvas.Top)"
                                 From="0" To="250" Duration="00:00:05">
                    <DoubleAnimation.EasingFunction>
                        <BounceEase Bounces="2" EasingMode="EaseOut" Bounciness="3"/>
                    </DoubleAnimation.EasingFunction>
                </DoubleAnimation>
            </Storyboard>
        </Canvas.Resources>
        <Ellipse x:Name="Balon" Width="50" Height="50" Fill="Black"/>
        <Button Canvas.Left="179" Canvas.Top="265" Content="Empezar" Height="23" Name="BtEmpezar" Width="75" Click="BtEmpezar_Click" />
        <Button Canvas.Left="270" Canvas.Top="265" Content="aParar" Height="23" Name="BtParar" Width="75" Click="BtParar_Click" />
    </Canvas>
</UserControl>

Ahora veamos el código de C#:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Silverlight_CPOO_03_Encapsulamiento
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void BtEmpezar_Click(object sender, RoutedEventArgs e)
        {
            SBAnimation.Begin();
        }

        private void BtParar_Click(object sender, RoutedEventArgs e)
        {
            SBAnimation.Stop();
        }
    }
}

Si repasamos el código de C#, en ninguna parte estamos creando algún tipo de funcionalidad para mover el objeto Balón de tipo Ellipse en pantalla, pero si se observa el código de cada evento generado por cada botón, allí se hace el llamado a funciones del objeto StoryBoard siendo estas Begin() y Stop(), cada una para iniciar y parar la animación respectivamente. Hasta este punto solo se ha estado configurando y estableciendo los llamados a los métodos que internamente ejecutan y controlan la animación, lo interesante acá es que para nosotros no es ni relevante, ni necesario conocer cómo se haya implementado el código que este por debajo de esos métodos, y es aquí donde vale destacar el poder de “encapsular”, pues se esta usando un objeto el cual determina cómo utilizar X configuración en pro de ejecutar una animación y después de eso la gestión será interna sin tener nosotros que preocuparnos por mucho más.

Veamos un pequeño video en el que se ve la ejecución de la aplicación:

CPOO en Silverlight – Modificadores de Ámbito– 08


Un tema importante a tener en cuenta en POO son los modificadores de ámbito.

DEFINAMOS

Un modificador de ámbito permite que las partes de un objeto puedan ser expuestas al exterior y a la vez especificar aquellas que no serán accesibles o modificables.

Los tres tipos de modificadores más importantes y a tener muy en cuenta en POO son:

public: Permite que un objeto, clase, propiedad, método entre otros sean accesibles desde cualquier punto de un código de Software Orientado a Objetos.

private: en cuanto a propiedades, métodos u otros componentes que pertenezcan a un objeto sólo se permite accederlos y manipularlos internamente en el bloque que define la clase y en ningún otro lugar más.

protected: Cuando se habla de un objeto que hereda de otro, es posible afirmar que, si un atributo, método u otro está marcado como protected, su uso sera posible en el bloque de la clase que lo define o en aquellas clases que están heredando de la principal.

Complementando este tema, en el siguiente post se habla sobre Encapsulamiento.

CPOO en Silverlight – Herencia – Interfaces – 07


Existe una tercer forma de permitir que una clase sea más robusta, y es a través de la interfaces como puedo indicar a una o varias clases un comportamiento similar.

DEFINAMOS

Una interface permite definir el tipo de objeto más abstracto posible en POO, debido a que no implementa ningún tipo de funcionalidad, carece de constructor y no se puede inicializar ninguna instancia a partir de su propio tipo.

PRACTIQUEMOS

1- Para crear una interface, lo primero es agregar un item tipo clase al proyecto y luego modificarle el atributo class por interface.

2 – Recordemos que a diferencia de las clases abstractas una interfas no implementa nada respecto a sus propiedades o métodos.

3 – A diferencia de herencia las interfaces indican uncicamente la forma de implementación.

Un ejercicio para aplicar esto puede verse en la necesidad de enviar diferentes avisos de publicidad a diferentes tipos de usuario. Por ejemplo en una Pizzería se requiere enviar la oferta del día en una forma muy gráfica a sus clientes favoritos, mientras que una Librería quiere enviar la la oferta del Libro recomendado para el día a sus clientes que son personas elegantes y serias.

Lo primero es crear un componente genérico sobre el cual se puedan cargar los mensajes que van a ser enviados. Y luego tener una forma de crear la interfaz de usuario, el mensaje y enviarlo.

Para este ejercicio se pensó la siguiente interface:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Silverlight_CPOO_02_Herencia_Interfaces
{
    public interface ICreadorMensaje
    {
        string Titulo { get; set; }

        string Contenido { get; set; }

        string De { get; set; }

        string Para { get; set; }

        void CrearMensaje(Panel panel);
    }
}

Como se vé, existen propiedades que permiten especificar el mensaje en sí, y existe un método el cual requiere como parámetro un objeto Panel en el cual se va a escribir o dibujar el mensaje que se envía al usuario final.

Se crean 2 UserControl, para simular los dos tipos de entidades, Librería y Pizzería así:

Páginas: 1 2 3

CPOO en Silverlight – Herencia y Clases Abstractas – 06


En POO además de poder heredar comportamientos o atributos, también es posible permitir que dichos comportamientos o características, sean definidos por las clases que implementen una clase abstracta.

DEFINAMOS

La Clase abstracta es una forma para definir un tipo de Objeto genérico, por lo tanto no será posible crear una instancia a partir de dicha clase.

Por ejemplo, pensemos en clases como Carro, Avión, Cicla o Barco, en común se puede abstraer que todos ellos son vehículos, así la definición de un tipo abstracto será la clase Vehiculo.


    public abstract class Vehiculo
    {
        public abstract void Encender();
        public abstract void Mover();
        public abstract void Parar();
        public abstract void Apagar();
    }

Un Vehiculo no constituye nada puntual para un software orientado a objetos, por lo tanto nunca podría crearse un objeto a partir de esta clase:

Pero si podemos crear clases las cuales hereden esa la clase abstracta:

    public class Avion: Vehiculo
    {

        public override void Encender()
        {

        }

        public override void Mover()
        {

        }

        public override void Parar()
        {

        }

        public override void Apagar()
        {

        }
    }

    public class Carro : Vehiculo
    {

        public override void Encender()
        {

        }

        public override void Mover()
        {

        }

        public override void Parar()
        {

        }

        public override void Apagar()
        {

        }
    }

     public class Barco: Vehiculo
    {

        public override void Encender()
        {

        }

        public override void Mover()
        {

        }

        public override void Parar()
        {

        }

        public override void Apagar()
        {

        }
    }

Así al inicializar un avión, carro o barco, lo que realmente se está haciendo es crear la instancia de un objeto tipo Vehiculo.

Pero esto no se diferencia mucho de lo que se vio en el capítulo anterior de Herencia. Entonces ¿Qué es y para que sirve una clase abstracta?

Para explicar esto veamos el siguiente ejemplo:

Para el ejemplo de la clase Vehiculo existen acciones (métodos) abstractas por ejemplo: Encender, Mover, Parar y Apagar pero para este caso será la responsabilidad de cada Subclase (Carro, Barco, Avion) implementar lo necesario para llevar a cabo esos procesos.

Páginas: 1 2

Subir ↑