Esta es una copia cruzada de mi blog original.
Puedes leer el articulo original con código coloreado y demás utilidades en
C# - Recibir notificaciones cuando hayan cambios de sesión parte 3 - WPF
------------------------
Artículos de este tema:
*Realmente son 6 articulos si contamos los mini post a los que se hace referencia
En artículos anteriores enseñe como crear una librería para interceptar las notificaciones generadas en el sistema cuando se hacen cambios de sesión y como utilizar esa librería en Windows Forms. En este artículo enseñare como hacer uso de ese componente en una aplicación para Windows Presentation Foundation - WPF.
LETS CODE!
Para Windows forms esta tarea es bastante sencilla e intuitiva, pero este no es el caso de WPF dadas las propias características de esta tecnología.
He creado una aplicacion WPF sencilla con un ListBox que se irá llenando a medida que lleguen notificaciones de cambios en las sesiones.
Para comenzar recibiendo notificaciones lo primero que se supone debemos hacer es registrar nuestra Ventana ya que eso dice en la documentación de msdn:
WTSRegisterSessionNotificationSession change notifications are sent in the form of a WM_WTSSESSION_CHANGE message. These notifications are sent only to the windows that have registered for them using this function.
Para el caso de WPF esto no es necesario ya que al parecer PresentationCore ya lo hace por nosotros.
Ya que por defecto ya estamos recibiendo las notificaciones de cambios en las sesiones, lo que debemos hacer es interceptar estos mensajes en el WndProc de manera muy similar a como lo hicimos con Windows Forms en el artículo anterior. Fácil, solo que... una ventana de WPF no expone el WndProc pequeño problema. :(
En resumen lo que debemos tener en cuenta para poder interceptar los mensajes desde WPF es:
- Obtener el manejador de la ventana, ya que lo necesitamos para el siguiente punto , y de paso también por default es inaccesible para WPF.
- Crear un Hook para el WndProc nativo, el cual es por default inaccesible desde WPF
- (No)Registrar la ventana para recibir notificaciones
- Modificar el comportamiento del WndProc
Obtener el manejador de la ventana
Como ya lo comente necesitamos el manejador para posteriormente crear un Hook al WndProc, en este mini artículo explico C# - Como obtener un manejador (handle) para una ventana de WPF , pero en resumen el código esta acá:
[csharp]
WindowInteropHelper interopHelper;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//Conseguir el Handle de la ventana
interopHelper = new WindowInteropHelper(this);
}[/csharp]
Crear un Hook para el nativo
Aunque ya estamos recibiendo las notificaciones lo cierto es que no estamos haciendo nada con ellas, para interceptarlas y comenzar a hacer algo es necesario usar el WndProc de la ventana WPF y capturar el mensaje de notificación que se envía desde el sistema de ventanas.
Como ya lo escribí arriba, el WndProc no esta disponible para una ventana WCF, para utilizarlo debemos obtener el manejador de la ventana, cosa que ya hicimos y crear un Hook al WndProc, en este artículo explico C# - Como usar el WndProc en una Ventana WPF , pero en resumen el código esta acá:
[csharp]
WindowInteropHelper interopHelper;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//Conseguir el Handle de la ventana
interopHelper = new WindowInteropHelper(this);
//Crear un hook al WndProc
HwndSource sourceWindow = HwndSource.FromHwnd(interopHelper.Handle);
sourceWindow.AddHook(WndProc);
}[/csharp]
Donde el parámetro WndProc es realmente un delegado a un método llamado intencionalmente así, como lo veremos más adelante.
Una vez creado el hook, debemos interceptar los mensajes del WndProc, revisamos la variable wParam del mensaje ya que esta nos da detalles adicionales acerca del evento que se ha generado. Para efectos de este ejemplo simplemente convierto ese valor a su equivalente en los enum de la librería creada en el articulo previo, y adiciono esa cadena al listbox para que básicamente nos vaya mostrando los mensajes que van llegando.
[csharp]
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == W32HandleSessionChanges.WM_WTSSESSION_CHANGE)
{
var name = Enum.GetName(typeof(SessionNotificationMsg), (SessionNotificationMsg)wParam);
this.listBoxOne.Items.Add(name);
handled = true;
return (IntPtr)1;
}
return IntPtr.Zero;
}[/csharp]
NOTA IMPORTANTE
WPF por defecto nos permite recibir notificaciones de la sesión actual, si queremos recibir notificaciones de todas las sesiones debemos des registrar la ventana y luego registrarla nuevamente con el parámetro NOTIFY_FOR_ALL_SESSIONS, así:
[csharp]
//Conseguir el Handle de la ventana
interopHelper = new WindowInteropHelper(this);
//Des Registramos
W32HandleSessionChanges.WTSUnRegisterSessionNotification(interopHelper.Handle);
//Registramos la forma para recibir notificaciones
W32HandleSessionChanges.WTSRegisterSessionNotification(interopHelper.Handle, NotifyType.NOTIFY_FOR_ALL_SESSIONS);
[/csharp]
El resultado
Ejecutamos el programa

Bloquemos nuestra sesión de Windows, volvemos a ingresar y…

Perfecto!!
eso fue todo.
Puedes leer el articulo original con código coloreado y demás utilidades en
C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Forms
----------------------
Artículos de este tema:
*Realmente son 6 articulos si contamos los mini post a los que se hace referencia
En mi artículo anterior enseñe como crear una librería para interceptar las notificaciones generadas en el sistema cuando se hacen cambios de sesión, en este artículo enseñare como hacer uso de ese componente en una aplicación para Windows Forms.
LETS CODE!
Divide y vencerás!, mi principio favorito. Seguiremos estos tres pasos:
- Registrar la ventana para recibir notificaciones
- Modificar el comportamiento del WndProc
- Des registrar la ventana para dejar de recibir notificaciones
He creado una aplicacion Windows Forms sencilla con un ListBox que se irá llenando a medida que lleguen notificaciones de cambios en las sesiones.
Registrar la ventana para recibir notificaciones
Para comenzar recibiendo notificaciones lo primero que debemos hacer es registrar nuestra Ventana, la Form, utilizando la API, para ello utilizamos la libreria que cree en C# - Recibir notificaciones cuando hayan cambios de sesión parte 1 simplemente usamos el evento load del form.
[csharp]
private void Form1_Load(object sender, EventArgs e)
{
//Registramos la forma para recibir notificaciones
W32HandleSessionChanges.WTSRegisterSessionNotification(this.Handle, NotifyType.NOTIFY_FOR_ALL_SESSIONS);
}
[/csharp]
Con esto nuestra ventana ya comienza a recibir notificaciones de cambios en las sesiones.
Modificar el comportamiento del WndProc
Aunque ya estamos recibiendo las notificaciones lo cierto es que no estamos haciendo nada con ellas, para interceptarlas y comenzar a hacer algo es necesario hacerle override al WndProc del form y capturar el mensaje de notificación que se envía desde el sistema de ventanas.
Una vez interceptado debemos revisar la propiedad wParam del mensaje ya que esta nos da detalles adicionales acerca del evento que se ha generado. Para efectos de este ejemplo simplemente convierto ese valor a su equivalente en los enum de la librería creada en el articulo previo, y adiciono esa cadena al listbox para que básicamente nos vaya mostrando los mensajes que van llegando.
En este caso paso como parámetro NOTIFY_FOR_ALL_SESSIONS para recibir notificaciones de cambios en todas las sesiones no solo en la actual
[csharp]
protected override void WndProc(ref Message m)
{
//Verificamos cuando el mensaje recibido sea el de cambios en la sesión
if (m.Msg == W32HandleSessionChanges.WM_WTSSESSION_CHANGE)
{
//convertimos el valor de wParam a su equivalente en nombre del enum
var name = Enum.GetName(typeof(SessionNotificationMsg), (SessionNotificationMsg)m.WParam);
this.listBox1.Items.Add(name);
}
base.WndProc(ref m);
}
[/csharp]
Des registrar la ventana para dejar de recibir notificaciones
Esta es la parte más fácil, antes de cerrar la ventana la des registramos:
[csharp]
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
//Des Registramos la forma para no recibir notificaciones
W32HandleSessionChanges.WTSUnRegisterSessionNotification(this.Handle);
}
[/csharp]
El resultado
Ejecutamos el programa

Bloquemos nuestra sesión de Windows, volvemos a ingresar y…

Perfecto!! 
En un próximo articulo veremos como hacer lo mismo con WPF.
Esta es una copia cruzada de mi blog original.
Puedes leer el articulo original con código coloreado y demás utilidades en
C# – Recibir notificaciones cuando hayan cambios de sesión parte 1
--------------
Artículos de este tema:
*Realmente son 6 articulos si contamos los mini post a los que se hace referencia
A veces necesitamos que nuestro software audite ciertos eventos generados por el equipo, como por ejemplo cuando se abren o cierran sesiones. Esto es importante por ejemplo para disparar procesos pesados cuando el computador no este en uso o para realizar procesos de auditoria.
Como es de suponerse el .Net Framework no trae nada que nos apoye en esa tarea ya que esta profundamente relacionada con el sistema operativo y ya que el CLR es multiplataforma este tipo de cosas no vienen soportadas. Se debe hacer uso de la Api de Windows.
En este artículo crearé una librería sencilla que permite ser notificado cuando suceden estos eventos bien sea en la sesión actual o a través de las diferentes sesiones iniciadas en el sistema.
NUESTRO KIT DE HERRAMIENTAS
Las cosas que necesitamos de la Api de Windows para realizar esta labor se describen a continuación
Funciones
Constantes para llamar a WTSRegisterSessionNotification
- NOTIFY_FOR_THIS_SESSION : Notifica eventos de la sesión actual
- NOTIFY_FOR_ALL_SESSIONS : Notifica eventos de todas las sesiones del sistema
Constantes relacionadas con las notificaciones
- WM_WTSSESSION_CHANGE : Mensaje generado cuando suceden los eventos de cambios en la sesión
- Parámetros:
- WTS_CONSOLE_CONNECT: Una sesión se ha conectado por terminal de consola.
- WTS_CONSOLE_DISCONNECT: Una sesión se ha desconectado por terminal de consola.
- WTS_REMOTE_CONNECT: Una sesión se ha conectado por una terminal remota.
- WTS_REMOTE_DISCONNECT: Una sesión de terminal remota se ha desconectado.
- WTS_SESSION_LOGON: Un usuario se ha logueado en la sesión.
- WTS_SESSION_LOGOFF: Un usuario se ha deslogueado de la sesión
- WTS_SESSION_LOCK: Una sesión se ha bloqueado.
- WTS_SESSION_UNLOCK: Una sesión se ha desbloqueado.
- WTS_SESSION_REMOTE_CONTROL: Una sesión ha cambiado su estado de control remoto. Par determinar el estado se debe hacer uso de GetSystemMetrics y revisar la métrica SM_REMOTECONTROL.
LETS CODE!
Preparando las funcionalidades de la Win32 API
Creamos una clase para centralizar los llamados a la API, allí con ayuda de DllImport importamos las funciones que requerimos y definimos todas las constantes necesarias, de preferencia agrupadas en enums:
Enums necesarias
[csharp]
/// Notificaciones a recibir
public enum NotifyType
{
/// Notificacion para la sesion actual
NOTIFY_FOR_THIS_SESSION = 0,
/// Notificacion para todas las sesiones del sistema
NOTIFY_FOR_ALL_SESSIONS = 1
}
/// Tipo de notificacion recibida
public enum SessionNotificationMsg
{
/// Una sesión se ha conectado por terminal de consola.
WTS_CONSOLE_CONNECT = 0x1,
/// Una sesión se ha desconectado por terminal de consola.
WTS_CONSOLE_DISCONNECT = 0x2,
/// Una sesión se ha conectado por una terminal remota.
WTS_REMOTE_CONNECT = 0x3,
/// Una sesión de terminal remota se ha desconectado.
WTS_REMOTE_DISCONNECT = 0x4,
/// Un usuario se ha logueado en la sesión.
WTS_SESSION_LOGON = 0x5,
/// Un usuario se ha deslogueado de la sesión.
WTS_SESSION_LOGOFF = 0x6,
/// Una sesión se ha bloqueado.
WTS_SESSION_LOCK = 0x7,
/// Una sesión se ha desbloqueado.
WTS_SESSION_UNLOCK = 0x8,
/// Una sesión ha cambiado su estado de control remoto. Par determinar el estado se debe hacer uso de GetSystemMetrics y revisar la métrica SM_REMOTECONTROL.
WTS_SESSION_REMOTE_CONTROL = 0x9
}
[/csharp]
Ahora la clase para manejar la W32API
[csharp]
using System;
using System.Runtime.InteropServices;
public static class W32HandleSessionChanges
{
///
/// Registra una ventana para recibir notificaciones de cambios en las sesiones
///
/// Manejador de la ventana
/// Modificadores
/// NOTIFY_FOR_THIS_SESSION, NOTIFY_FOR_ALL_SESSIONS
///
///
[DllImport("wtsapi32.dll", SetLastError = true)]
public static extern bool WTSRegisterSessionNotification(IntPtr hWnd, NotifyType dwFlags);
///
/// Des Registra una ventana que recibe notificaciones de cambios en las sesiones
///
/// Manejador de la ventana
///
[DllImport("wtsapi32.dll", SetLastError = true)]
public static extern bool WTSUnRegisterSessionNotification(IntPtr hWnd);
/// Mensaje recibido cuando hay cambios en las sesiones
public const int WM_WTSSESSION_CHANGE = 0x2b1;
}
[/csharp]
Para usarla basta con hacer uso del método W32HandleSessionChanges.WTSRegisterSessionNotification, el parámetro hWnd es el manejador de la ventana donde queremos recibir la notificaciones, esto nos permite registrar la ventana actual para recibir este tipo de mensajes, asi que una vez hecho esto se deben interceptar los mensajes para hacer lo que necesitemos. Una vez se valla a cerrar nuestro programa siempre es coveniente llamar a WTSUnRegisterSessionNotification
La librería que he creado se puede usar en diferentes tipos de aplicación para comenzar a recibir notificaciones, en próximos artículos les mostrare como utilizarla en Windows Forms y en WPF.
Esta es una copia cruzada del artículo escrito en el blog original:
C# – WPF – Escalar el tamaño de la fuente al cambiar el tamaño de la ventana o control
---------------------------------------------------------
Cambiar el tamaño de la fuente a medida que el control cambia de tamaño es una tarea frecuente, pero esta pobremente documentada, en este articulo esta la respuesta.
Este es uno de esos temas…
Puedes pasar horas buscando diferentes alternativas alrededor de la web, encontraras cosas como
- ViewBox
- FontSizeConverter
- IValueConverter
- etc.
Nada de eso funciona al menos no como se espera, aunque según el caso pueden dar una buena aproximación a la solución.
He escrito este artículo para ayudar a muchos desarrolladores (y diseñadores) a resolver este problema de manera definitiva.
Cómo realizar el cálculo de tamaño de fuente?
Dado que las fuentes, en su mayoría, son más altas que anchas es importante entonces que usemos como referencia la propiedad Height del control contenedor para definir el tamaño de la fuente con respecto a su dimensión más grande.
El alto de la fuente esta dictado por la medición de tres partes básicas:
- Ascendente
- Descendente
- Inicial
Observando esta gráfica es fácil hacerse una mejor idea:

La clase FontFamily en WPF posee la propiedad LineSpacing, la cual es ni más ni menos que el alto total de la fuente de acuerdo a los parámetros anteriormente citados.
Sin embargo esto no es todo, la propiedad LineSpacing es un valor genérico para la FontFamily sin importar el tamaño actual de la fuente utilizada, es decir este atributo nos da una relación proporcional respecto al tamaño de la fuente en unidades em.
Por ende podemos decir que el alto de una fuente en unidades em es
Alto = tamaño fuente * FontFamily.LineSpacing
Eso es correcto, pero nosotros no necesitamos calcular el alto de la fuente, sino calcular el tamaño de la fuente con respecto al Height del contenedor ( Button, Window etc), en ese caso la formula a utilizar sería:
tamaño fuente = Alto / FontFamily.LineSpacing
Implementación
Creamos una ventana de WPF con el siguiente código
1 2 3 4 5 6 7 8 9 10 | <Window x:Class="AutoScaleFont.MainWindow"
Title="MainWindow" Height="350" Width="525">
<DockPanel>
<Label HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
SizeChanged="Control_SizeChanged">
Test</Label>
</DockPanel>
</Window>
|
En el archivo de código creamos el controlador para el evento SizeChanged
1 2 3 4 5 | private void Control_SizeChanged(object sender, SizeChangedEventArgs e)
{
Control tmp = sender as Control;
tmp.FontSize = e.NewSize.Height / tmp.FontFamily.LineSpacing;
}
|
El código se explica a si mismo, sin embargo haré una explicación breve. Establecemos la propiedad FontSize de acuerdo a la formula explicada más arriba tomamos el nuevo Alto del control y lo dividimos en la propiedad LineSpacing del FontFamily utilizado por el control.
Una optimización adicional es hacer que el alto de la fuente sea calculado con un valor levemente menor al del control contenedor para dejar un espacio de margen, con el ánimo de hacerlo proporcional le restamos solo un porcentaje respecto al alto total, en este caso el 5%, quedando así:
1 2 3 4 5 | private void Control_SizeChanged(object sender, SizeChangedEventArgs e)
{
Control tmp = sender as Control;
tmp.FontSize = (e.NewSize.Height - e.NewSize.Height * .05d) / tmp.FontFamily.LineSpacing;
}
|
Iniciemos la ejecución y revisemos el resultado:



Eso es justo lo que deseamos!
Si lo deseas puedes hacerlo respecto al ancho del control en lugar de respecto al alto, según sea tu necesidad, en ese caso debes ayudarte con la clase FormattedText y su propiedad Width para hallar el largo total en pixeles de la cadena.
Una semana agitada sin duda, negocios, aprendizaje, cambios en el trabajo, nuevas propuestas, mucho trasnocho… y enfermo.
Ha sido difícil. Sin embargo tengo una hermosa familia y muchas cosas positivas que lo compensan todo.
Así que las cosas son buenas, pero serían mejor.
Viernes 1 Abril 2011 09:12:17
Salía para una reunión, pero decidí ver el correo justo antes de salir, me lleve una agradable sorpresa

Inmerecido?
No lo se, de verdad no se que pensar, cada día que paso metido en temas tecnológicos me encuentro con gente grande, verdaderamente GRANDE, no solo en el sentido técnico sino también en su espíritu profesional, en su pasión y en su vida. No me puedo igualar con ninguno.
Han sido duras lecciones, seguramente muchos pasan eso en algún momento y supongo que, tristemente, no todos se logran dar cuenta de lo equivocados que estaban.
En el año 2003, o por esa época, solía creerme el super programador, el mejor en todo, sin duda era muy bueno en muchas cosas, era ‘un enorme genio’ frente a mi computador donde solo contaba Yo.
Así es fácil creerse un genio.
Con el tiempo la vida, como de costumbre, me ha dado duras lecciones, que considero me han hecho un mejor hombre y un mejor profesional.
Mis diferentes trabajos me fueron aterrizando, luego en 2007 me comencé a vincular con las comunidades y allí comenzaron a cambiar, de raíz, dos cosas:
- Ya no estaba frente al computador de mi casa, ahora estaba en una comunidad de muchas personas genio
- Ya no era un genio, me di cuenta que nunca lo fui.
Con el paso de los años he continuado aprendiendo cosas, técnicas y humanas, y también he conocido mucha gente, diferentes personas distribuidas geográficamente en lo que en otro momento llamábamos el enorme planeta tierra, hoy todos estamos a un clic de distancia.
Esta corta distancia me permitió descubrir a todos los verdaderos genios y talentos que hay allí justo a un clic de distancia de mí, cada semana o incluso cada día logro descubrir personas que son mucho mejores que yo, y que de una u otra forma, son mis maestros.
En mi opinión muchos o tal vez todos ellos merecen ser reconocidos como MVP, muchos ya lo son, pero he aprendido y tengo que aprender tantas cosas de ellos que bueno, a veces me pregunto si verdaderamente lo merezco.
Para ser reconocido como MVP he necesitado de muchas personas
Creo que no soy Juan Carlos Ruiz Microsoft MVP a secas.
Para lograr este reconocimiento he necesitado del apoyo de muchas personas, de mi equipo de amigos colaboradores de BogotaDotNet, de mi familia, de mis compañeros de trabajo, de mis followers en las redes sociales, de mis inspiradores y…
de mis detractores.
Mi nombramiento no es solo un reconocimiento para mí, sino es un reconocimiento para todos ustedes.
Soy Juan Carlos Ruiz Microsoft MVP porque cuento con personas como ustedes, alguien que "se cree un genio detrás del computador de su casa" no puede ser un MVP por si solo, mucho menos tres veces seguidas. He necesitado de su apoyo incondicional, de sus críticas, de sus ideas, de los espacios que me han brindado, de sus ganas de aprender, de sus ganas de enseñar, de su ejemplo y de su reconocimiento.
Gracias a todos por esta tercera vez y por todas las anteriores.
Esta es una copia cruzada del artículo escrito en el blog original:
MVP por tercer año consecutivo – no se como me aguantan
---------------------------------------------------------
Esta es una copia cruzada del artículo escrito en el blog original:
Porqué mis soluciones de SharePoint instaladas por PowerShell no se ven en la galería de soluciones?
---------------------------------------------------------
Interesante pregunta.
SharePoint 2010 posee una característica llamada Sandboxed Solution, estas soluciones son las instaladas por ‘el usuario final’ y estas quedan en una ‘capsula’ de seguridad que evita la ejecución de código malintencionado o dañino dentro de SharePoint. Solo las soluciones instaladas y creadas como Sandboxed Solution aparecen en la galería de soluciones del sitio, así mismo las características de estas soluciones solo son visibles si la solución es de tipo SandBoxed.
Por el contrario las soluciones ‘normales’ o avanzadas de SharePoint solo pueden ser instaladas a través de un Project setup o de comandos vía PowerShell, al ser soluciones no ‘de usuario’ estas son visibles únicamente desde el sitio de administración central de SharePoint 2010 y no es posible que un usuario las instale agregándolas a la galería de soluciones de su sitio, ya que sería alertado con que la solución no contiene un XML esperado… el XML de las Sanboxed Solutions.
Así las cosas si deseas que tu solución de SharePoint 2010 permita ser instalada tan solo agregándola a la galería de soluciones y que sus características sean habilitadas o deshabilitadas desde las pantallas del usuario, tendrás que crearlas como Sandboxed Solution, de lo contrario crea y desplega una solución normal.
Incluso si tu solución solo consta de WebParts la única forma de que SharePoint desempaquete todo el .wsp desde la UI de aplicación es que tu solución sea de tipo sandbox, de lo contrario debes hacer la instalación asistida por comandos de PowerShell.
Saludos,
Esta es una copia cruzada del artículo escrito en el blog original:
Como eliminar un .webpart de SharePoint 2010 que no se borra despues de desinstalar la solución via PowerShell
---------------------------------------------------------
Como lo comenté en un artículo anterior una vez se desinstala una solución que contiene un .webpart por alguna razón este .webpart persiste en la Galería de elementos web de SharePoint 2010, para borrarlo hay que utilizar un poco de ‘astucia’ de desarrollador utilizando PowerShell.
He creado este sencillo script de PowerShell el cual con solo indicar el url del sitio y el nombre del .webpart es capaz de encontrarlo y borrarlo.
Para mayor funcionalidad el nombre del .webpart lo he dejado como una cadena de expresiones regulares de tal forma que podamos hacer una selección más fléxible delos .webpart que deseamos remover.
Como todo, no es perfecto, es susceptible de mejora, una primera mejora sería hacerlo independiente del idioma ya que el nombre de la galería esta establecido por defecto en español pero cambia si utilizas la versión en inglés o en otro idioma.
Acá les dejo el script que sin lugar a dudas sacara de apuros a más de uno al rededor de la web.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.WebPartPages")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Publishing")
$url = Read-Host "Ingrese el nombre del servidor"
$wps = Read-Host "Escriba el patrón del webpart"
$SPSite = New-Object Microsoft.SharePoint.SPSite($url)
$SPWeb = $SPSite.OpenWeb()
$WebPartGallery = $SPWeb.Lists["Galería de elementos web"]
$gall = $WebPartGallery.Items | select Name
$count = $gall.Count
$count
for ( $i =0; $i -lt $count;$i++)
{
Write-Host "Actual:" $gall[$i].Name
if ($gall[$i].Name -match $wps)
{
Write-Host "found"
$WebPartGallery.Items.Delete($i)
$SPWeb.Update()
Write-Host "$wp borrado"
}
}
$SPWeb.Dispose()
|
Un ejemplo de uso para eliminar el .webpart del que hablamos en este artículo “Como instalar una solución (.wsp) de SharePoint 2010 via PowerShell” es
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | .\borrarWebpart.ps1
GAC Version Location
--- ------- --------
True v2.0.50727 C:\Windows\assembly\GAC_MSIL\Microsoft.SharePoint\14.0.0.0__71e9bce111e9429c\Microsoft.SharePo...
Escriba el patrón del webpart: ^TestWeb.*$
11
Actual: MSContentEditor.dwp
Actual: MSPageViewer.dwp
Actual: MSImage.dwp
Actual: MSMembers.dwp
Actual: MSSimpleForm.dwp
Actual: MSUserDocs.dwp
Actual: MSUserTasks.dwp
Actual: MSXml.dwp
Actual: MSPictureLibrarySlideshow.webpart
Actual: Silverlight.webpart
Actual: TestWebPart_VisualWebPart1.webpart
found
borrado
|
Estoy imaginando muchas sonrrisas en este momento ! XD
Esta es una copia cruzada del artículo escrito en el blog original:
Como instalar una solución (.wsp) de SharePoint 2010 via PowerShell
---------------------------------------------------------
Hola, dado la poca documentación que existe en la web al respecto de este tema he decidido escribir este artículo que estoy seguro le será de mucha utilidad a todos ustedes.
Una vez generado el paquete desde Visual Studio 2010, abrimos una consola de administración de SharePoint, sobra decir que la debemos abrir con privilegios de administrador ( clic derecho, ejecutar como administrator ).
Inicia el trabajo, revisaremos primero la forma de realizar la instalación, seguidamente como hacer la desinstalación y finalmente un tip que les será útil a todos.
Instalación de la solución
La instalación se divide en 3 partes
- Subir la solución
- Instalarla
- Activar las características
Procedemos a ejecutar los siguientes pasos en la consola de administración de SharePoint 2010, como la instalación puede ser un proceso ‘incomodo’ entonces lo primero que realizaremos será crear tres variables, una de ellas para la ubicación del sitio, otra para el nombre de la solución y una última para el nombre de la característica.
En este ejemplo los valores para esas variables son:
- url del sitio esta en http://localhost
- nombre de la solución TestWebPart.wsp
- nombre de la única característica de la solución “TestWebPart Feature1″ o su id = “64C2C32C-064D-4216-BB63-6A67EFE828D1″
Así que los primeros comandos a ejecutar son para inicializar las variables
1 2 3 | $SolName="TestWebPart.wsp"
$FeaName="TestWebPart_Feature1"
|
1. Subir la solución
Cambiamos al directorio donde esta el archivo .wsp
seguidamente ejecutamos el siguiente comando, -LiteralPath nos pide el path completo del archivo .wsp, no importa si ya estamos en el directorio en todo caso debemos poner la ruta completa.
1 | Add-SPSolution -LiteralPath "C:\TestWebPart.wsp"
|
Esto nos debe generar la siguiente salida
1 2 3 | Name SolutionId Deployed
---- ---------- --------
testwebpart.wsp 2361bfd2-d113-4f4d-8941-cfdb66edb891 False
|
2. Instalar la solución
Una vez hemos subido la solución al servidor procedemos a instalarla así
1 | Install-SPSolution -Identity $SolName -WebApplication $SiteUrl -GACDeployment
|
Si el comando fue exitoso no hay ningún feedback por consola.
3. Activación de las características de la solución
La solución ya está instalada así que ahora debemos activar las características que hemos incluido. Si hemos desarrollado un Webpart desde Visual Studio 2010 este crea automáticamente una característica, podemos instalarla haciendo uso de su nombre o de is en caso de que lo hayas generado
Tip: si el nombre de la característica tiene espacios, deberás reemplazarlos por el carácter ‘_’ (línea al piso)
1 | Install-SPSolution -Identity $SolName -WebApplication $SiteUrl -GACDeployment
|
Si el comando fue exitoso no hay ningún feedback por consola.
Con eso finalizamos la parte de la instalación, así que vamos a SharePoint y verificamos.
En este caso estamos instalando un webpart así que vamos a Acciones del sitio, Configuración, Elementos web y allí debes encontrar el webpart que acabamos de instalar.

Desinstalación de la solución
Esta parte es básicamente lo mismo pero al revez, si, así de fácil.
- Desactivar las características
- Desinstalar la solución
- Remover la solución
1. Desactivar las características
1 | Disable-SPFeature -Identity $FeaName -Url $SiteURL -Confirm:$false
|
Si es exitoso no hay respuesta
3. Remover la solución
Este comando no sirve pada nada. Así es lo tenemos que ejecutar pero no hace lo que se supone que debe hacer, o mejor, lo hace a medias…
1 | Remove-SPSolution -Identity $SolName -Confirm:$false
|
Si es exitoso no hay respuesta.
Sin embargo si revisamos nuestro webpart aún aparece solo que no se puede usar para nada. Se supone que precisamente este comando lo remueve, pero realmente remueve la solución pero no todos sus componentes, de seguro un bug.
En un próximo artículo les mostraré como eliminar por completo el rastro del webpart que no desapareció.
Quieres actualizarte con C# 3.5, 4.0
y comenzar tu camino para ser experto en C#?
Llego el momento! no pierdas la oportunidad hay cupos limitados!
Este es el curso que estabas esperando!

Juan Carlos Ruiz Pacheco Microsoft MVP Visual C#, Co – director de la comunidad BogotaDotNet, Arquitecto de Software, Conferencista e Instructor reconocido en toda Latinoamérica dictará en Bogotá el curso " Profundización C# ", el curso realiza un estudio de las diferentes características del lenguaje C# desde el punto de vista de uno de los expertos más reconocidos en el país.
Este se encuentra dividido en tres bloques principales:
1. Nivelación : Se abordan incluso temas de conocimiento básico profundizando en su verdadera naturaleza y los potenciales inconvenientes o situaciones que se pueden presentar en un entorno real
2. Actualización de lenguaje: El recorrido incorpora una exploración en las versiones y características distintivas de C# 2.0, 3.0, 3.5 y la versión 4.0, por lo que se trataran temas como inferencia de tipos, tipos dinámicos, entre otros.
3. Análisis Profundo: Las diferentes temáticas permiten identificar ciertos comportamientos ‘extraños’ dentro de las aplicaciones lo cual permitirá al estudiante adquirir destreza en su identificación y prevención.
El curso tiene una duración de 15 horas y un costo de $370.000 x persona.
Temario:
Clic para agrandar el detalle:

Este articulo es publicado originalmente en mi blog ideas de un conejo:
http://juank.black-byte.com/varios-ie9-personalizando-sitio-pinned-site/
---------------------------
En el artículo anterior vimos como utilizar nuestro sitio en el menú de inicio y como dejarlos establecido como Pinned Site.
Continuando con el tema ahora les mostraré como podemos personalizar de manera más granular esta funcionalidad.
Listado de características
Partiendo del hecho que nuestro sitio sea lanzado como Pinned Site, podemos cambiar ciertas características sin incurrir en ningún esfuerzo de programación. Esta lista muestra la características (tomado de msdn).
Nombre
Contenido
application_name
El nombre que se mostrara para la aplicación en el menú inicio y en el tooltip del taskbar
msapplication-tooltip
Opcional, texto mostrado en el tooltip del icono agregado a la barra de inicio o en el icono del taskbar
msapplication-starturl
La página principal de la aplicación. Sino se establece, se utiliza la dirección de la´página actual. Solo admite protocolos HTTP, HTTPS o FTP.
msapplication-navbutton-color
Es el color de los botones Atrás y Adelante de los comandos de navegación para mostrar cuando se ha abierto un Pinned Site. Cualquier nombre de color, color hexa definido por hojas de estilo en cascada (CSS), nivel 3 (CSS3) son validos. Para más información ver Tabla de Color. Si este meta elemento no esta presente, el color se crea con base al icono establecido como favicon.
msapplication-window
El tamaño inicial de la ventana del browser para el Pinned Site. Se establece el valor estableciendo el tamaño con números separados por punto y coma.
* width = N (mínimo 800)
* height = N (mínimo 600)
Si el usuario cambia el tamaño de la ventana en adelante se omitirán estos valores.
Ejemplo en el sitio de Ideas de un Conejo
<meta name="application-name" content="{Blog de Juan Carlos Ruiz – MVP Visual C#}" />
<meta name="msapplication-tooltip" content="Más allá de los sistemas de información: (C#)=> videojuegos, soluciones a problemas interesantes y Sistemas Operativos." />
<meta name="msapplication-starturl" content="http://juank.black-byte.com" />
<meta name="msapplication-window" content="width=1024;height=600" />
<meta name="msapplication-navbutton-color" content="#344D00" />
El Resultado

Como les pareció?
luce genial!
*Noten que ahora se ve más claro
el resultado de utilizar los íconos en altas resoluciones de acuerdo a lo recomendado en el artículo anterior.
Artículos de la serie:
IE9 – Adicionando el sitio al menú de inicio y como “Pinned Site”
IE9 – Personalizando el sitio cuando es lanzado como “Pinned Site”
IE9 – Definiendo opciones para el “Pinned Site” en el JumpList
IE9 – Mostrando overlay icons
Este articulo es publicado originalmente en mi blog ideas de un conejo:
http://juank.black-byte.com/varios-ie9-menu-inicio-pinned-site/
---------------------------
Continuando con la serie de artículos dedicados a aprovechar en este blog las características de IE9, en este artículo enseñaré a utilizar la características agregar un sitio al menú de inicio y de utilizar de Pinned Sites.
*Desde luego este artículo describe como utilizar estas características desde el punto de vista de un programador o de un web master, no desde el punto de vista del usuario final.
Estas características las podemos utilizar para que el usuario habitual de nuestro sitio tenga una manera fácil y directa de acceder a el , al tiempo que le brindamos funcionalidades adicionales que harán más enriquecedora su experiencia de navegación.
Adicionar nuestro sitio al menú de inicio

Esta funcionalidad permite al usuario agregar nuestro sitio como si fuera una aplicación más del menú de programas, si bien el usuario puede hacerlo a través de las opciones de Internet Explorer, nosotros podemos colocar un shortcut que lo haga desde nuestro propio sitio.
Antes de utilizar las instrucciones que nos permiten hacer ello es importante asegurarnos de dos cosas, primero que el el usuario este utilizando Internet Explorer 9, ya que de lo contrario el script fallará y segundo verificar que nuestro sitio no este ya previamente abierto como Pinned Site, para fortuna nuestra ambas validaciones las podemos hacer con el método msIsSiteMode de la siguiente forma.
try {
if(window.external.msIsSiteMode()) { }
else {}
}
catch(e) { }
Como se puede ver, sino estas en IE9 se ira por la exception, de lo contrario se ejecutará normalmente. Este método nos sirve para identificar si el sitio ha sido abierto normalmente o desde un pinned site.
Una vez estamos seguros, podemos utilizar un código HTML como este para que el usuario agregue nuestro sitio al menú inicio:
<a onclick="window.external.msAddSiteMode();" href="#">Adicióname al menú de inicio!</a><br />
Adicionar nuestro sitio a la barra de inicio, como Pinned Site
Para hacer esto no existe una API que nos lo permita hacer, el usuario debe por consentimiento propio anclar nuestro sitio a la barra. Esto lo puede hacer de dos formas
1- Una vez instalado nuestro sitio en el menú de inicio, ejecutarlo y cuando este en ejecución dar click derecho sobre el icono y seleccionar la opción “anclar este programa a la barra de tareas”.

2- Cuando el usuario este navegando en el sitio puede tomar con el mouse la pestaña de IE9 y arrastrarla hasta la barra de inicio para finalmente liberarla allí.

Un conjunto de cosas Importantes
Cuando un usuario configura un sitio como pinned site hay varias características que debe notar al acceder al sitio:
- los colores de los botones de IE9 se modifican automáticamente de acuerdo al color predominante en el favicon del sitio
- como ahora se abre un IE9 optimizado para nuestro sitio, ya no aparece el botón “home” (la casita) en los comandos de IE9
- en el costado izquierdo de la barra de navegación aparece el favicon de nuestro sitio
- si el usuario hace clic derecho sobre el icono de nuestro sitio se despliegan opciones personalizadas para nuestro sitio, a diferencia de si hace clic derecho sobre la ventana de IE en cuyo caso se despliegan las opciones normales para el browser
Características como los colores de los comandos, el icono , y el contenido de las JumpList (las opciones) puede ser modificados por nosotros como desarrolladores, y ese será el tema de nuestros próximos artículos.
Sin embargo y como adelanto necesario, hay un tema que no da espera.
Recomendaciones para los íconos.
Si bien por defecto IE9 utilizara el favicon de nuestro sitio, es probable que no contemos con un ícono de la calidad adecuada para ser desplegado en la hermosa barra de Windows 7 ni dentro de IE9.
Mi recomendación es que tengan como mínimo un ícono en formato .ico y con las siguientes dimensiones:
Si fuera posible lo óptimo es utilizar un ícono con las siguientes dimensiones:
Respecto al color lo mejor es tener cada una de las resoluciones del ícono con los siguientes tipos de color
- 32 bit (paleta XP)
- 8 bit (256 colores)
Es decir como mínimo nuestro ícono debe contener 6 imágenes con las diferente resoluciones y combinaciones de color.
Para el caso de este blog (“Ideas de un Conejo”) el ícono utilizado esta a: 16×16,24×24,32×32,64×64 a 8 y 32 bit de color.
Si bien Visual Studio permite crear y trabajar con iconos, mi recomendación es que utilicen un programa especializado en el tema, a mi personalmente este me parece el mejor ( y es gratis ): IcoFX

Hasta la próxima.
Artículos de la serie:
IE9 – Adicionando el sitio al menú de inicio y como “Pinned Site”
IE9 – Personalizando el sitio cuando es lanzado como “Pinned Site”
IE9 – Definiendo opciones para el “Pinned Site” en el JumpList
IE9 – Mostrando overlay icons
Esta es una copia del artículo original publicado en mi blog,
el artículo original con código y texto completemante formateado se puede ver en:
C# - El extraño caso de la ventana sin borde que no se deja cambiar de tamaño
------------------------------------------------------------------------------------------------------------------
Cómo hacer una ventana sin borde que se deje redimensionar
Hola,
tal vez este titulo les parezca repetido, pero no es así. Quiero traer a colación uno de mis artículos más populares en la web:
C# – El extraño caso de la ventana sin borde que no se deja maximizar ni minimizar
Bien, en el continuo devenir de mi hobbie, que es programar, tuve la oportunidad de ayudarle a un amigo, más conocido como VIRUTERO_5 quien en dado momento estaba trabajando con una ventana sin borde, con tan mala suerte que necesitaba que esta ventana se dejara redimensionar por el usuario, pero como ustedes podrán adivinar… no es posible hacer esto por si solo.
Así que estuve revisando el tema por un rato y llegue a dos soluciones, una de ellas rápida con resultados ‘modestos’ y otra un poco más demorada pero con resultados mucho más profesionales.
A continuación expondré las dos soluciones, y como siempre, tratando que la funcionalidad sea muy entendible para todos aunque es claro que ya en sus labores podrán organizarla mucho mejor.
Para hacer este ejercicio lo primero es crear un proyecto de Windows Forms, utilizaremos la forma creada por defecto para hacer lo demás.
Método 1, rápido y resultados modestos
Dejamos el Form tal y como queda creado por defecto.
Una vez más debemos sobrescribir la propiedad CreateParams, allí cambiaremos el estilo inicial de la forma dejándolo tal como esta pero quitándole el atributo WS_CAPTION, que básicamente es la barra de título.
const int WS_CAPTION = 0xC00000;
protected override CreateParams CreateParams
{
get
{
CreateParams p = base.CreateParams;
p.Style &= ~WS_CAPTION;
return p;
}
}
Eso es todo, el resultado es una ventana a la que se le puede cambiar el tamaño, aunque no es del todo una ventana sin borde.

La solución más fácil y obvia es “quitemos el borde” esto lo podemos hacer quitando además de WS_CAPTION aWS_THICKFRAME tal y como lo mostré en el artículo C# – El extraño caso de la ventana sin borde que no se deja maximizar ni minimizar, pero el problema es que precisamente WS_THICKFRAME es el que le da al Form la funcionalidad de cambiar el tamaño. Así que hasta aquí llega el método 1.
Método 2, demorado pero con resultados más profesionales
Esta vez, desde el diseñador, dejamos el Form sin borde.
Hacer que el Form luzca como un objeto que se deja cambiar de tamaño
Lo primero que debemos hacer es que el Form luzca como un objeto que se deja cambiar de tamaño, puesto que sino tiene borde hay que buscar una forma de que el usuario se de por enterado de que SI puede cambiarle el tamaño.
Para poder dibujar el SizeGrip debemos determinar su tamaño, para mi gusto 15px es perfecto, y debemos dibujarlo en la ubicación tradicional que es en la parte inferior derecha del Form.
Es importante tener en cuenta que si el usuario cambia el tamaño del Form la ubicación relativa del SizeGrip cambiará también ya que debe ajustarse a las nuevas dimensiones así que creamos un método capaz de establecer el Rectangledonde se dibujara el SizeGrip de acuerdo al tamaño del Form.
Rectangle sizeGripRectangle;
const int GRIP_SIZE = 15;
private void AdaptGripRectangle()
{
sizeGripRectangle.X = this.Width - GRIP_SIZE;
sizeGripRectangle.Y = this.Height - GRIP_SIZE;
}
public Form1()
{
InitializeComponent();
sizeGripRectangle.Width = sizeGripRectangle.Height = GRIP_SIZE;
AdaptGripRectangle();
}
Como ya tenemos definido del tamaño y la ubicación del SizeGrip modificaremos el evento Paint para dibujarlo. Utilizaré la notación lambda por que me gusta más, no se confundan, es lo mismo que utilizar un delegado o los eventhandler tradicionales.
public Form1()
{
InitializeComponent();
sizeGripRectangle.Width = sizeGripRectangle.Height = GRIP_SIZE;
AdaptGripRectangle();
this.Paint += (o, ea) => { ControlPaint.DrawSizeGrip(ea.Graphics,
this.BackColor,
sizeGripRectangle); };
}
La clase ControlPaint incorpora varios métodos útiles, uno de ellos es precisamente DrawSizeGrip que hace el dibujo que necesitamos. Para ello le pasamos como Color el BackColor de la forma actual, para que se vea más natural, y desde luego el Rectangle que define el SizeGrip
Ejecutamos nuestra Form y se ve así:

Hacer que el SizeGrip sirva para algo
Todo va muy bonito, muy simpático pero completamente inútil. El SizeGrip hasta el momento no es nada más que un adorno pero no sirve para nada. Hay que hacer que funcione.
Antes que nada necesitamos un método que nos diga si un punto dado, por ejemplo la ubicación del mouse, esta encima del SizeGrip esto es fácil de hacer:
private bool IsInSizeGrip(Point tmp)
{
if (tmp.X >= sizeGripRectangle.X
&& tmp.X <= this.Width
&& tmp.Y >= sizeGripRectangle.Y
&& tmp.Y <= this.Height
)
return true;
else
return false;
}
Una vez hecho esto, hay que detectar cuando el mouse hace clic sobre el SizeGrip. Para ello creamos una variable boolean llamada inSizeDrag y la modificaremos con los eventos MouseDown y MouseUp, de tal forma que si el usuario deja presionado el botón del mouse justo sobre el SizeGrip ponemos la variable en true, y una vez levante el botón del mouse ponemos la variable en false.
//declaramos esta variable en la clase
bool inSizeDrag = false;
//...
//...
//Adicionamos este codigo en el constructor
//justo despues de donde hicimos lo del evento Paint
this.MouseUp += delegate { inSizeDrag = false; };
this.MouseDown += (o, ea) =>
{
if (IsInSizeGrip(ea.Location))
inSizeDrag = true;
};
Gracias a esto ya podemos detectar cuando el usuario quiere cambiar el el tamaño del Form, así que solo basta con modificar el evento MouseMove, allí detectamos si se pretende cambiar el tamaño del Form y si es así entonces procedemos a cambiarle el tamaño de acuerdo a las coordenadas del mouse.
A las coordenadas del mouse les he adicionado la mitad del tamaño del SizeGrip para producir un efecto más natural.
//La mitad del tamaño del SizeGrip
//se declara en al clase
const int GRIP_SIZE_OVER_TWO = GRIP_SIZE / 2;
//...
//..
//esto lo colocamos justo despues de donde
//hemos colocado todo el código anterior
this.MouseMove += (o, ea) =>
{
if (inSizeDrag)
{
this.Width = ea.Location.X + GRIP_SIZE_OVER_TWO;
this.Height = ea.Location.Y + GRIP_SIZE_OVER_TWO;
AdaptGripRectangle();
this.Invalidate();
}
};
Eso es todo, pueden ver la aplicación y el ejemplo completo disponible para descarga al final del artículo en mi blog.
Ventana Sin Borde pero Resizable.
byte!
Este artículo es una copia cruzada del artículo original en mi blog:
C# – Aplicaciones multilenguaje ( globalización y localización )
-------------------------------------------------------------------------------------
Continuamente en mis conferencias y de paso por los foros a través de internet encuentro multitud de dudas e inquietudes al respecto de Cómo hacer una aplicación que soporte múltiples idiomas, ciertamente hay varias formas de conseguirlo y no todas esas formas son buenas en todos los escenarios, dependiendo de diferentes factores como por ejemplo el tamaño de la aplicación o la cantidad de idiomas soportados.
Sin embargo yo tengo mi método preferido, el cual considero que es válido para la inmensa mayoría de aplicaciones desarrolladas, el método de los archivos de recursos y ese es el tema principal de este artículo.
En tres pasos enseñare como hacerlo.
- Utilizar archivos de recursos para manipular las cadenas de texto
- Soportar múltiples lenguajes con los archivos de recursos
- Aislar los archivos de recursos para facilitar la actualización
Finalmente relacionare otros temas de interés para tener una funcionalidad más robusta.
1. UTILIZAR ARCHIVOS DE RECURSOS PARA MANIPULAR LAS CADENAS DE TEXTO
PREPARAR LA APLICACION
Lo primero que debemos hacer es crear una aplicación de Windows Forms con 1 ListBox y 5 Botones como se ven la siguiente imagen.

Para fines de este ejemplo con excepción de los textos del listbox ninguno de los textos es obligatorio.
Ahora, dentro de la solución, creamos una carpeta la cual llamaremos “Recursos Localizables”, justo como se ve a continuación.

Ahora creamos un nuevo archivo de recursos y lo llamaremos StringResources, debemos crearlo junto dentro de la carpeta “Recursos Localizables” que acabamos de crear.
Revisamos las propiedades del archivo recién creado y nos aseguramos que en Build Action diga “Embedded Resource”.
Ahora utilizaremos ese archivo de recursos para guardar las cadenas en el idioma principal (por defecto ) de nuestra aplicación, así que le damos doble clic y adicionamos los valores que se ven en la siguiente imagen.

Para efectos del ejemplo es importante hacerlo con los valores que ven.
UTILIZAR EL ARCHIVO DE RECURSOS EN NUESTRA APLICACION
Esta parte es muy sencilla, creamos un método llamado AplicarIdioma con el siguiente código:
private void AplicarIdioma()
{
button1.Text = StringResources.ButtonLabel1;
button2.Text = StringResources.ButtonLabel2;
button3.Text = StringResources.ButtonLabel3;
button4.Text = StringResources.ButtonLabel4;
button5.Text = StringResources.ButtonLabel5;
this.Text = StringResources.WindowTitle;
}
Y lo llamamos desde el Form_Load, ejecutamos la aplicación y obtenemos esto

2. SOPORTAR MÚLTIPLES LENGUAJES CON LOS ARCHIVOS DE RECURSOS
Casi todo el trabajo de codificación ha terminado ahora viene ‘la magia’ . En la carpeta “Recursos Localizables” creamos 3 copias de el archivo de recursos original, nos aseguramos de que cada una de ellas quede con los siguientes nombres.

Ahora editamos cada uno de ellos dejándolos con los textos que se ven a continuación (pueden ayudarse de traductores online para obtener los caracteres en japonés).



Una vez hecho esto procedemos a modificar el evento SelectedIndexChanged del listbox y lo dejamos así:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo((string)listBox1.SelectedItem);
AplicarIdioma();
}
Lo que hemos hecho es hacer que cada vez que se de clic en uno de los miembros de la lista se cambie la cultura de la interfaz de usuario del hilo actual de la aplicación, y dado que cada miembro del listbox es el nombre corto de cada una de las tres culturas que tenemos, basta con crear un nuevo objeto de tipo CultureInfo que coincida con el nombre corto del ítem seleccionado.
PORQUÉ Y PARA QUÉ?
Esto que acabamos de hacer tiene un importante objetivo.
Cuando se utiliza un archivo de recursos el CLR busca primero cual es la cultura del hilo actual, entonces con ese dato automáticamente utiliza el archivo de recursos cuya nomenclatura coincide con esa cultura, sino encuentra dicho archivo de recursos entonces el CLR utiliza el archivo de recursos que no tiene cultura específica.
FUNCIONA!
Ejecutamos la aplicación, damos clic en cada uno de los ítems del listbox y podemos ver esto :) :

3. AISLAR LOS ARCHIVOS DE RECURSOS PARA FACILITAR LA ACTUALIZACIÓN
Hasta aquí nuestro proyecto ya esta terminado y ya estamos en capacidad de hacer aplicaciones multilenguaje, sin embargo como tip final de este artículo les recomiendo que si piensan incluir alguna funcionalidad de actualizaciones en sus aplicaciones y tienen planeado actualizar o incluir nuevos idiomas en su aplicación, coloquen los archivo de recursos en una dl por aparte donde solo se coloquen archivos de recursos, esto permitirá que las actualizaciones relacionadas con cadenas de lenguaje se aíslen en un solo componente.
Para que esto funcione, en el proyecto de la librería que utilicen para tal fin, recuerden establecer en cada archivo de recursos el modificador de acceso en public como lo muestra esta imagen.

LECTURAS RECOMENDADAS
Este tema puede ir aún más allá de donde lo hemos llevado, los invito averiguar acerca de como utilizar ensamblados satélite para brindar algunas funcionalidades adicionales y que intenten utilizar la clase CultureInfo y demás relacionadas para detectar el idioma de la interfaz de usuario actual o el idioma con el cual se ha instalado el sistema operativo.
En Sistemas como Windows 7 si instalas el sistema en inglés y luego le actualizadas el lenguaje a español, algunas funciones te seguirán reportando que el idioma del sistema esta en inglés por lo que hay que hacer un trabajo adicional para detectar el idioma actual de la interfaz de usuario actual.
Pueden bajar la solución completa aquí: Articulo Aplicaciones multilenguaje ( globalización y localización )
Espero que le puedan sacar mucho provecho.
Saludos.
Este articulo es copia del articulo original tomado de mi blog
http://juank.black-byte.com/eventos-bogotadotnet-barcamp-bogota-2010/
------------------
Hola, BogotaDotNet te invita a participar del Barcamp el próximo 21 de Agosto en las instalaciones de la Fundación Universitaria CAFAM.

Un Barcamp es el nombre que recibe una no-conferencia generada por los usuarios. No tiene nada muy formal y los errores/fallas/problemas son siempre bien recibidos. Los asistentes llegan, van poniendo su tema de presentación en una pared; y la gente elige a cuál asistir.
Un Barcamper debe estar preparado para:
- Participar
- Discutir
- Llevar su laptop (aunque no es vital)
- Llegar temprano y ayudar con la puesta en escena
- Y mantener siempre la buena onda
Detalles del evento
Cuándo: Sábado 21 de agosto de 2010
Horario: 9:00a.m.-5:00p.m.
Dónde: Fundación Universitaria Cafam
Inscripción
Para asistir al barcamp NO es obligatorio inscribirse, pero aun así es bueno para que sepamos cuantos puestos montar:Inscripción Barcamp Bogotá 2010
Patrocinadores
Todavía no tenemos patrocinadores si conoce a algún interesado, por favor comuníquese con los organizadores o escriba en twitter usando el tag barcampbogota.
Conferencias
Dentro de la amplia gama de no-conferencias que se darán, algunos de los integrantes de BogotaDotNet serán speaker de estas:
|
Hora
|
Tema
|
Ponente
|
|
09:00
|
Desarrollo para Windows Phone 7
|
Roberto Alvarado
|
|
09:30
|
Entity Framework 4.0, beneficios como herramienta ORM
|
Nelson Venegas
|
|
10:00
|
SQL Server 2008 R2 Express
|
John Alexander Bulla
|
|
10:30
|
Parallel Computing Development
|
Juan Carlos Ruiz
|
Los esperamos Inscripción Barcamp Bogotá 2010
Esta es una copia del artículo original publicado en mi blog:
----------------------------
Hola, hace unos meses escribí este artículo acerca de esta herramienta: “Add-In Express for IE” que facilita enormemente la creación add-ons para Internet Explorer : C# – Creando Toolbars, Botones y Menús para Internet Explorer
Llegué a esta herramienta gracias a un proyecto importante que esta desarrollando Microsoft en el país, me han contactado para llevarlo a cabo y de paso me contaron que utilizarían esta herramienta para llevar a cabo este proyecto.
Como lo mencione anteriormente al comienzo creí que sería un proyecto realizado con IE SDK y COM pero apenas me confirmaron de la existencia de esta herramienta me puse en la labor de documentarme a través de internet.
Construir un Addon para IE es algo bastante interesante y en esencia sencillo de realizar haciendo uso de “Add-In Express for IE”.
Me detuve por unos instantes a pensar que cosas se pueden hacer con esta herramienta y me di cuenta que para sacarle máximo provecho es conveniente idear componentes dinámicos que permitan al usuario interactuar de manera directa con el contenido desplegado en el toolbar, sidebar o botón.
Dentro de los miles de diferentes alternativas que puedan existir para crear componentes dinámicos he optado por tratar 2 temas:
- Consumo de RSS para despliegue de información
- Crear una caja de búsqueda
En este artículo enseñaré como crear un componente Add-In Express for IE que consumiendo datos de un RSS se comporte de manera dinámica.
Creare un componente que lea el RSS de Top News desde The Washington Post y despliegue esos datos como un texto con híper vínculo. Ese componente lo colocare en un toolbar para IE.
CONSUMIR EL RSS DE TOP NEWS
Esta tarea la puedo realizar haciendo uso de este sencillo método que he creado:
C# – Consumir un XML o un RSS alojado en la web de manera sencilla
Simplemente llamaré al método pasándole la URL del RSS de Top News: http://www.washingtonpost.com/wp-dyn/rss/linkset/2005/03/24/LI2005032400102.xml
PASO 1 – CREAR EL PROYECTO

PASO 2 – CREAR UNA CLASE QUE ALOJE EL METODO PARA CONSUMIR EL RSS
using System.Net;
using System.Data;
/// Provee funcionalidades de conexión a una URL que publica un archivo XML
public static class RemoteXML
{
///
/// Se conecta a una URL que representa un archivo XML y convierte la información en un DataSet
///
/// URL del xml publicado en la web
/// Dataset que representa los datos XML
public static DataSet GetXMLDataSet(string URL)
{
HttpWebRequest xmlRequest = (HttpWebRequest)WebRequest.Create(URL);
DataSet xmlData = new DataSet();
xmlData.ReadXml(xmlRequest.GetResponse().GetResponseStream());
return xmlData;
}
}
PASO 3 – CREAR UN TOOLBAR
Esto es sencillísimo gracias a “Add-In Express for IE”, tan solo:
- clic derecho sobre el proyecto
- adicionar nuevo ítem
- y…

PASO 4 – CREAR UN LABEL PARA MOSTRAR EL CONTENIDO DEL RSS Y HACER LINK
El toolbar como tal es un Panel vacio así que arrastro allí un nuevo label, la mejor parte es que los controles para adicionar en el toolbar son los mismos controles de Windows Forms :) ( he colocado colores distintos para distinguir los controles ).

PASO 5 – CONSUMIR EL RSS Y TOMAR LA PRIMERA NOTICIA
Ahora utilizando el método del paso 2 tomare el RSS y hare uso de la primera noticia. Para tal fin he creado una estructura RSSEntryInfo:
/// Representa información de una entrada RSS
public struct RSSEntryInfo
{
public string title, url;
}
Seguidamente creo el siguiente método dentro de la clase RemoteXML:
///
/// Devuelve la última entrada de un RSS
///
///
private static RSSEntryInfo GetLatestRSSEntry(string RSSUrl)
{
RSSEntryInfo ni = new RSSEntryInfo();
try
{
using (var datos = RemoteXML.GetXMLDataSet(RSSUrl))
{
foreach (DataRow row in datos.Tables["item"].Select())
{
ni.title = (string)row["title"];
try
{
ni.url = (string)row["link"];
}
catch
{
ni.url = ((Uri)row["link"]).AbsoluteUri;
}
break;
}
}
}
catch
{
throw;
}
return ni;
}
Es IMPORTANTE tener cuenta que si la implementación de GetXMLDataSet incluye la carga del XSD de RSS 2.0 entonces el URL vendrá en formato de objeto Uri. Ver "Nota Adicional" al final de el artículo:
C# – Consumir un XML o un RSS alojado en la web de manera sencilla
PASO 6 – CONFIGURAR EL LABEL CON LA INFORMACION OBTENIDA DEL RSS
Ahora hay que configurar el label con la información, para ello he creado un método lblLastTopNewInfo dentro del código del toolbar, y he creado una variable string para almacenar la URL de la última noticia. Acá utilizo el RSS de top news de The Washington Post: http://www.washingtonpost.com/wp-dyn/rss/linkset/2005/03/24/LI2005032400102.xml
/// URL donde esta la noticia contenida en el label
string ltnUrl;
/// Trae la última noticia de un RSS y establece la información necesaria en el label
private void lblLastTopNewInfo()
{
var ltnInfo = RemoteXML.GetLatestRSSEntry("http://www.washingtonpost.com/wp-dyn/rss/linkset/2005/03/24/LI2005032400102.xml");
lblLastTopNew.Text = ltnInfo.title;
ltnUrl = ltnInfo.url;
}
PASO 7 – PROGRAMAR EL EVENTO CLIC DEL LABEL PARA HACER QUE IE NAVEGUE A LA URL DE LA ULTIMA NOTICIA
Para poder hacer que IE navegue al URL de la última noticia hare uso de otra de las funcionalidades de “Add-In Express for IE”, cada objeto creado ( toolbar, bar, etc ) tiene dos referencias a IE una de ellas a un tipo object, y la otra al mismo tipo object pero accediéndolo como Interop.SHDocVw.WebBrowser, esto facilita enormemente trabajar con el browser, en cada objeto de “Add-In Express for IE” tenemos esta referencia en el campo IEApp.
Así queda el evento clic del label:
///
/// Hace que IE navegue al URL correspondiente
///
///
///
private void lblLastTopNew_Click(object sender, EventArgs e)
{
object nullObject =null;
this.IEApp.Navigate(ltnUrl, ref nullObject,
ref nullObject, ref nullObject, ref nullObject);
}
PASO 8 – HACER QUE EL LABEL ARRANQUE CON LA INFORMACION DEL RSS
Para ello programo el evento OnConnect del toolbar, este evento se dispara cada vez que el Toolbar se integra con IE.
///
/// Configura el estado inicial del label
///
///
///
private void TWPToolbar_OnConnect(object sender, int threadId)
{
lblLastTopNewInfo();
}
PASO 9 – HACER QUE CADA HORA SE REFRESQUE LA ULTIMA NOTICIA
Con un System.Timers.Timer establezco que cada 30 minutos se llame a lblLastTopNewInfo()
/// Temporizados para refrescar la última noticia
System.Timers.Timer timerWpLn = new System.Timers.Timer();
///
/// Configura el estado inicial del toolbar
///
///
///
private void TWPToolbar_OnConnect(object sender, int threadId)
{
lblLastTopNewInfo();
timerWpLn.Interval = 1000 * 60 * 30;
timerWpLn.Elapsed += new System.Timers.ElapsedEventHandler(timerWpLn_Elapsed);
timerWpLn.Enabled = true;
timerWpLn.Start();
}
///
/// Establece periodicamente los valores del label
/// que muestra la última noticia
///
///
///
void timerWpLn_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
lblLastTopNewInfo();
}
Adicionalmente he coloreado el label de color azul, y he hecho que al pasar el mouse por encima del control el cursor del mouse cambie para mostrar que es un híper vínculo, esto en los eventos MouseEnter y MouseLeave.
PASO 10 – INTEGRAR, COMPILAR Y PROBAR EN IE
Esto es muy fácil, das doble clic sobre IEModule para abrir el panel del módulo, voy a las propiedades del módulo y entro donde dice toolbars :
Allí agrego un nuevo toolbar y lo configuro como se ve en esta imagen:
compilo la solución, luego clic derecho en el proyecto y selecciono Register ADX Project,

abro IE y listo! ... ver video abajo.
http://www.youtube.com/watch?v=ovIZtcmkkNA&feature=player_embedded
Este artículo es una copiar cruzada del artículo original publicado en mi blog:
C# – Consumir un XML o un RSS alojado en la web de manera sencilla
------------------------------
Muchas veces necesitamos leer contenidos RSS o XML desde la web, y lo necesitamos de manera rápida, ligera y fácil de usar.
Buscando a través de la internet se pueden conseguir varias soluciones de varios sabores diferentes.
En este artículo enseñare a crear un componente capaz de leer cualquier XML que se encuentre en la web con el fin de acceder a su información de manera sencilla y de paso explicaré que hacer cuando ese XML sea un RSS para sacarle mayor provecho.
El problema lo podemos fraccionar en 2 partes
Obtener el XML o RSS de la web
- Acceder a esa información por medio de un componente conocido, un Dataset
OBTENER EL XML O RSS DE LA WEB
Para lograr este objetivo se hace necesario hacer uso de un objeto HttpWebRequest para crear un Request a la URL donde se encuentra alojado el XML y luego capturar la respuesta (Response).
public static DataSet GetXMLDataSet(string URL)
{
HttpWebRequest xmlRequest = (HttpWebRequest)WebRequest.Create(URL);
WebResponse xmlResponse = xmlRequest.GetResponse();
}
ACCEDER A ESA INFORMACION POR MEDIO DE UN COMPONENTE CONOCIDO, UN DATASET
Aunque ya tenemos el WebResponse este de por si no nos permite un acceso ‘multiuso’ a la información que contiene, pero ya que sabemos que nuestro WebResponse contiene información XML podemos aprovecharnos de eso para crear un Dataset. El Dataset se puede crear a partir de un Stream así que haremos uso del método GetResponseStream para obtenerlo, creamos un DataSet vacio y luego lo llenamos con ReadXml.
public static DataSet GetXMLDataSet2(string URL)
{
HttpWebRequest xmlRequest = (HttpWebRequest)WebRequest.Create(URL);
WebResponse xmlResponse = xmlRequest.GetResponse();
Stream responseStream = xmlResponse.GetResponseStream();
DataSet xmlData = new DataSet();
xmlData.ReadXml(responseStream);
return xmlData;
}
Reduciendo un poco el código queda:
public static DataSet GetXMLDataSet(string URL)
{
HttpWebRequest xmlRequest = (HttpWebRequest)WebRequest.Create(URL);
DataSet xmlData = new DataSet();
xmlData.ReadXml(xmlRequest.GetResponse().GetResponseStream());
return xmlData;
}
Ya estuvo, ahora es tiempo de sacarle provecho al DataSet.
This is a cross
copy of my original blog:
http://juank.black-byte.com/reviews-c-creating-toolbars-buttons-and-menus-for-internet-explorer/
------------------------------------
Hi!,
Recently I was looking for documentation to be able to create components for IE, traditional things like toolbars, buttons and menus.
The problem
In the beginning I was excited, but once I caught the appropriate documentation I found something that could be unfortunate, to create this kind of components for IE I had to make use of COM technology, so I had two possible ways:
Program this Add-ons using C++
- Program the Add-ons using C# but using COM interoperability
But then came the great disappointment. Whatever the choice, programming using COM technology seemed inevitable. Bad news.
Not that COM is an impossible subject, what happens is that I believe one has to assess these two aspects:
- Effort / Benefit proportion: How long will I spend creating the solution and How much should I charge?
- Maintenance time, How much time must I invest in supporting the solution once it is delivered?
In my case if I don’t use COM but use a managed component, both aspects above would be playing for me. However, I think it is clear for any .NET developer, that if I use COM both aspects above would be playing against me.
The Solution
I was set to find across the internet some product that would allow me create Add-ons for IE using managed components, the pleasant surprise was when I found one called “Add-In Express for IE” I stopped for a while to review what kind of things can I can do using this Tool and I realized that the tool was exactly I was looking for, the solution to my problems.
What does “Add-In Express for IE”?
A few paragraphs back I mentioned two important aspects where clearly I specified that cost/benefit is something very important to take in account.
I want to invite you to review some articles that show How to create Add-ons for IE using COM:
Creating Add-ons for Internet Explorer: Toolbar Buttons
Creating Custom Explorer Bars, Tool Bands, and Desk Bands
Summarize the most troublesome and annoying issues to just to create a button and a toolbar:
- Create and modify registry keys
- I must write code using some ‘Service Providers’
- I must use in my code some things to ‘Query Interfaces’
What???
Yes, this is what I asked too, Why I must concerned about all those items if I just want to create two of the most common and simple things in Windows UI development?
For sure there exist some heavy reasons to do that, but neither me nor my client are interested in those heavy reasons.
“Add-In Express for IE” has rich functionality, very interesting and very useful, but for now I will sum up all in one:
- You can create a complete solution just coding what you really need.
I
mean, if I want just to create a button in a toolbar, all I have to do in my
code is to handle the click event over the button, nothing else. I don’t need to take care of registry keys, service providers or query interfaces of I don’t know…what… Simply I code what I need, everything else is done by Add-In Express for me.
Great!!!
And then…
“Add-In Express for IE” is one of those tools that make you give thanks to God ( whatever your God ) for having found it, with this tool you can create solutions in a very fast way concentrating in What you need but not on How you do it.
Among other things that makes this too pay off, you can find:
- Creating an IE Add-on in a record time
- Version neutrality
- Support for 32 and 64 bit Add-ons
- Ease to test your solution in IE without necessity to go into details of the full installation process of your Add-on
- Simplicity of creating a solution installer, it is done automatically.
In my next article I would expose the ease of create a solution, I mean we’ll come into the tech! Meanwhile I invite you to check these illustrative videos available in the Add-In express site:
http://www.add-in-express.com/programming-internet-explorer/video.php
I hope this article make your life easy
Greetings.
Esta es una copia cruzada del artículo original en mi blog:
http://juank.black-byte.com/reviews-addin-express-internet-explore/
----------------------------------------------
Hola ,
Hace poco estuve buscando documentación para poder crear componentes para IE, cosas tradicionales como Toolbars, botones y menús.
El problema
En principio estaba entusiasmado, pero una vez di con la documentación adecuada me encontré con algo que puede parecer desafortunado, para poder crear este tipo de componentes paras IE tenía que hacer uso de componentes COM, así que solo tenía dos salidas posibles:
- Programar estos add-ons con C++
- Programarlos con C# pero utilizando interoperabilidad con COM
Pero luego llegó la gran decepción…
Genial! cualquiera que fuera la opción programar con COM parecía inevitable. Malas noticias.
No es que COM sea un tema imposible, lo que sucede es que yo creo que uno tiene que evaluar dos aspectos:
- La proporción esfuerzo/beneficio: cuanto me demoro en crear la solución y cuanto debo cobrar
- El tiempo de mantenimiento, que tiempo debo invertir en estabilizar la solución después haberla entregado
En mi caso sino utilizara COM sino un componente administrado, los dos puntos anteriores estarían en mi favor, pero es claro para cualquier desarrollador de .NET que en el caso de COM esos puntos jugarían en mi contra.
La solución
Me puse en tarea de buscar por internet algún producto que me permitiera crear add-ons para internet explorer con componentes administrados, la grata sorpresa fue que encontré uno llamado “Add-In Express for IE” me detuve por unos instantes a revisar que cosas podía hacer con esta herramienta y me di cuenta que realmente era la herramienta que estaba buscando, la solución a mis problemas.
Qué hace Add-In Express for IE?
Unos párrafos atrás mencioné dos puntos importantes en los cuales claramente identifico que el tema de costo/beneficio es algo muy importante a tener en cuenta.
Quiero invitarlos a revisar algunos artículos que muestran como crear add-ons para Internet Explorer utilizando COM:
Creating Add-ons for Internet Explorer: Toolbar Buttons
Creating Custom Explorer Bars, Tool Bands, and Desk Bands
Resumiré los temas más molestos y engorrosos para tan solo crear una barra de herramientas y un botón:
- Crear y modificar llaves de registro
- Tener que crear mi código utilizando algunos ‘Proveedores de Servicios’
- Tener que utilizar en mi código algunas cosas para ‘Consultar Interfaces’
¿Qué???
Si, eso mismo me pregunte yo, porque tengo que ver todos esos temas si lo único que quiero es crear dos de las cosas mas sencillas que se pueden hacer en la UI de un programa en Windows?
Seguramente hay razones de peso, pero ni a mi ni a mi cliente les interesan esas razones de peso.
“Add-In Express for IE” tiene muchas funcionalidades, muy interesantes y muy útiles, pero por ahora yo las resumiré en una:
- Te permite crear la funcionalidad completa solo codificando lo que realmente necesitas
Es decir si quiero crear un toolbar con un botón, lo único que tendré que hacer por código es programar el evento clic del botón nada más. No necesito pensar en llaves de registro, proveedores de servicios ni consultar interfaces de no se que… simplemente programo lo que necesito, el resto Add-In Express lo hace por mi.
Genial!!!
Y Entonces…
“Add-In Express for IE” es una herramienta de esas que hacen que des gracias a Dios ( cualquiera que sea el tuyo ) de haberlas encontrado, con esta herramienta se pueden crear soluciones de manera muy rápida concentrándote en el Qué necesitas y no en el Cómo lo haces.
Dentro de las cosas que hace esta herramienta y que realmente hacen que su precio se pague por si solo se encuentran:
- Crear Add-in para internet explorer en tiempo record
- Ser neutral entre diferentes versiones de IE
- Soporte para 32 y 64 bit
- Facilidad para testear tu solución en IE sin necesidad de realizar el proceso de instalación completo
- Facilidad para crear el instalador de manera automática
En mi próximo artículo expondré la facilidad con la que se puede crear una solución, es decir entramos a lo técnico!, mientras tanto los invito a checar los videos ilustrativos que disponibles en la página:
http://www.add-in-express.com/programming-internet-explorer/video.php
Espero que este artículo le facilite la vida a muchas personas!
saludos.
Esta es una copia cruzada del articulo original escrito en mi blog:
http://juank.black-byte.com/eventos-mvp-segunda-vez/
----------
Enhorabuena. Nos complace presentarle el programa de nombramiento MVP de Microsoft® de 2010. Este nombramiento se concede a los líderes excepcionales de la comunidad técnica que comparten de forma activa su experiencia de alta calidad y de la vida real con otras personas. Le agradecemos especialmente la contribución que ha realizado en las comunidades técnicas en el área de Visual C# a lo largo del pasado año.
Así comienza el email con el que Microsoft me ha notificado, por segundo año consecutivo como Microsoft MVP Visual C# .

Para mí es motivo de orgullo ser galardonado por segundo año consecutivo, ser galardonado como MVP se siente muy cool, es como estar escalando una montaña solo por placer y al final en la cima ser recibido con un refrescante baso de agua que no esperabas.
MVP, el premio nobel y premios de concurso
Alguien alguna vez (y perdón que no lo cite pero no recuerdo quien fue), me dijo que ser MVP es un tipo diferente de premio.
Si ves un concurso de belleza, todas las candidatas hacen todo lo que deban hacer para ganar, si vas a un partido de futbol sucede lo mismo, así como en las carreras, los bolos, la universidad, las elecciones presidenciales etc. Todos hacen, dicen, crean e incluso algunos inventan y engañan porque tienen muy claro que hacen lo que hacen para ganarse el concurso, un premio.
Ganarse un premio nobel es diferente. Pero como hace alguien para ganarse un premio nobel? ciertamente nadie sabe que debe hacer para ganarse un premio nobel porque de hecho los ganadores del premio nobel tienen muchos objetivos en su cabeza , muchos objetivos menos el de ganarse un premio nobel.
Nadie espera que al final de un largo año(o años ) de investigación o de gestión por la paz o de escritura de obras literarias llegue el comité del premio nobel a premiarlo. No, eso no es así. Simplemente cada cual da lo mejor que puede en el campo que le corresponde, y lo hace por pasión porque persigue un sueño, porque hace lo que le gusta y sabe que así engrandece al ser humano y se engrandece para sí mismo.
El premio nobel no se busca, simplemente llega como resultado colateral del inmenso trabajo que haces.
Así es el galardón MVP, no se puede buscar ser MVP n i trabajar arduamente para llegar a ser MVP, porque de hecho puedes llegar a trabajar arduamente durante años y nunca llegar a serlo por X circunstancias*.
Aunque no se si sea un ejemplo muy adecuado, el galardón MVP es como el abrazo de tu madre al graduarte de la universidad, estudiaste e hiciste un excelente trabajo de grado para graduarte como profesional, pero el abrazo de tus seres queridos es un reconocimiento especial a tu labor.
Agradecimientos
Realmente, y lo repito, para mi es un motivo de satisfacción enorme el ser reconocido como MVP por segundo año consecutivo.
Sin embargo la labor que se me reconoce no habría sido posible sin la colaboración y ayuda de muchísimas personas que de alguna manera ayudan a que esta labor de compartir conocimientos sea posible, quisiera listarlos a todos pero no puedo, en todo caso sino están en la lista créanme que de igual forma les estoy enormemente agradecido:
- Core group BogotaDotNet, mis compañeros de equipo
- Cesar de la Fundacion Universitaria Cafam, quien de manera 100% desinteresada nos ha colaborado cediendo un espacio cómodo muy adecuado para nuestras conferencias y algunos cursos.
- Ivonne y William de Tecnoparque, quienes han abierto un canal a través del cual hemos participado en conferencias y otros proyectos.
- Maribel y Alex de IT Talent, gracias a su compromiso con la educación y con las labores sociales nos han permitido hacer uso de sus aulas de manera gratuita, lo cual nos ha llevado a ayudar más personas y crecer como comunidad. Gracias a ellos BogotaDotNet puede dar los cursos que da.
- Walter de Microsoft y el equipo actual y pasado de DPE, con quienes de manera conjunta hemos realizado varias actividades, como los WorkShops de {activa} y demás.
- Personal Campus Party ( Colombianos, mexicanos y alemanes ), por brindarme el espacio para realizar conferencias en el Campus del año pasado, y por las posibilidades que como individuo y como comunidad nos tienen para este año.
- Leandro Tuttini y el equipo de moderadores de los foros de msdn, porque gracias a ellos una tarea tan dura como la moderación esta siendo muy productiva y valiosa.
- Natalia y Jorge de Sketch Inc, quienes han abierto un espacio idóneo para intercambiar información y generar contenidos de gran calidad para la comunidad de profesionales y usuarios de tecnologías Microsoft: El Community Madia Center.
- IT Pros DC por inspirarme a participar en comunidades, y porque fue allí dónde aprendí a ser speaker y me abrieron espacio para dar conferencias cuando era un completo newbie.
- Willy Marroquin por inspirarme a trabajar por una pasión y no por ni para un titulo.
- A los lectores de mis artículos en mi blog
Y desde luego hago una mención muy especial a mi Familia quienes han tenido que aguantar y ceder un poco de su tiempo en mis sesiones de intenso trabajo, esto no habría sido posible sin su apoyo y tolerancia. No sere cursi, este reconocimiento es mio, fruto de mi esfuerzo, pero ninguno de esos esfuerzos habria sido posible sin sus cuidados, afectos colaboración y haladas de orejas cuando debieron hacerlo.
Bien eso es todo.
*Al respecto de qué es necesario para ser reconocido como MVP pueden visitar estos artículos en el blog de Fernando Garcia Loera. MVP Lead para América Latina:
MVP por segundo año consecutivo – reflexiones, notas y agradecimientos
More Posts
« Previous page -
Next page »