Etiqueta: Windows 8

  • Usar un temporizador en las aplicaciones de Windows store (Visual Basic)

    Pues eso… que estoy probando esto de la creación de aplicaciones para Windows 8 (para la tienda de Windows o Windows store) y quería crear un programa simple que mostrase la fecha y la hora y se fuese actualizando cada segundo…

    Esto en una aplicación de escritorio no es nada complicado… y en una aplicación XAML para la tienda de Windows 8 tampoco lo tendría que ser… el problema es que no encontraba la definición del control Timer (no existe) ni la definición de la clase Timer (definida en System.Timers o en System.Threading) que en una aplicación para Windows store no están definidas.

    Buscando buscando me encontré con varias clases, dos de ellas algo "liantes" de usar (además de que sin ejemplos para Visual Basic), me refiero a las clases definidas en Windows.System.Threading: ThreadPoolTimer (y otra de la que ya ni me acuerdo).

    La cuestión es que también me encontré con la que he usado en este primer ejemplo, esta clase se llama DispatcherTimer y está definida en el espacio de nombres Windows.UI.Xaml, y es más sencilla de utilizar sobre todo para todo lo relacionado con la creación del método de evento, ya que se puede usar WithEvents para la definición de la variable y crear fácilmente dicho método de evento; aunque en este ejemplo usaré AddHandler para indicar cuál es el método de evento (el que se ejecutará cada vez que pase el tiempo indicado en el intervalo), esto lo hago así de "complicado" porque después publicaré el código para los que le gusten usar los puntos y comas, es decir, el código para C#.

     

    El ejemplo es muy simple, tendremos un par de bloques de texto y un botón para iniciar/detener el temporizador.

    Primero te muestro el código XAML del fichero MainPage.xaml y después veremos el código de Visual Basic (cuando lo tenga publicado te pondré el enlace a la versión de C#).

     

    MainPage.xaml:

    <Page
        x:Class="Reloj_Windows_8.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Reloj_Windows_8"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <StackPanel Orientation="Vertical" Margin="10" HorizontalAlignment="Stretch"  VerticalAlignment="Center">
                <TextBlock x:Name="txtHora" Margin="20" Text="19:47:00" TextAlignment="Center" Foreground="Lime" FontWeight="Bold" FontFamily="Consolas" FontSize="72" />
                <TextBlock x:Name="txtFecha" Margin="10" Text="viernes 30 noviembre 2012" TextAlignment="Center" Foreground="Lime" FontWeight="Bold" FontFamily="Consolas" FontSize="36" />
                <StackPanel HorizontalAlignment="Center" Margin="10">
                    <Button x:Name="btnStop" Content="Stop" Margin="20"/>
                </StackPanel>
            </StackPanel>
        </Grid>
    </Page>
    

     

     

    MainPage.xaml.vb:

    Public NotInheritable Class MainPage
        Inherits Page
    
        Private intervalo As Integer = 900
    
        ' La clase DispatcherTimer está definida en el espacio de nombres:
        ' Windows.UI.Xaml
        Private timer1 As DispatcherTimer
    
        ''' <summary>
        ''' Invoked when this page is about to be displayed in a Frame.
        ''' </summary>
        ''' <param name="e">Event data that describes how this page was reached.  The Parameter
        ''' property is typically used to configure the page.</param>
        Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
            actualizarHora()
    
            btnStop.Content = "Start"
            btnStop_Click(btnStop, Nothing)
        End Sub
    
        ''' <summary>
        ''' Asigna la fecha y hora en las cajas de texto
        ''' </summary>
        Private Sub actualizarHora()
            Me.txtHora.Text = DateTime.Now.ToString("HH:mm:ss")
            Me.txtFecha.Text = DateTime.Now.ToString("dddd, dd MMMM yyyy")
        End Sub
    
        ''' <summary>
        ''' Este evento es del temporizador y
        ''' se ejecutará en cada intervalo.
        ''' </summary>
        ''' <remarks>
        ''' Es conveniente no usar un valor muy pequeño para el intervalo
        ''' lo recomendable es un poco menos de 1 segundo (1000 milisegundos)
        ''' En el programa utilizo un valor de 900 milisegundos
        ''' </remarks>
        Private Sub timer1_Tick(sender As Object, e As Object) 'Handles timer1.Tick
            actualizarHora()
        End Sub
    
        ''' <summary>
        ''' Parar o iniciar el temporizador
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub btnStop_Click(sender As Object, e As RoutedEventArgs) Handles btnStop.Click
            If btnStop.Content.ToString = "Stop" Then
                timer1.Stop()
                btnStop.Content = "Start"
            Else
                timer1.Start()
                btnStop.Content = "Stop"
            End If
        End Sub
    
        Public Sub New()
    
            ' This call is required by the designer.
            InitializeComponent()
    
            ' Add any initialization after the InitializeComponent() call.
    
            ' crear el temporizador
            timer1 = New DispatcherTimer
            AddHandler timer1.Tick, AddressOf timer1_Tick
            ' el intervalo: 900 milisegundos (algo menos de 1 segundo (1seg = 1000ms))
            timer1.Interval = New TimeSpan(0, 0, 0, 0, intervalo)
            'timer1.Start()
        End Sub
    

     

     

    Espero que te sea de utilidad.

    ¡esa es la intención! 😉

     

    Por cierto, esta aplicación la publicaré en el Windows Store y allí la iré actualizando (ya te avisaré cuando esté publicada, si es que la publican, claro).

    Como me gusta que las cosas sean "gratis" el precio será de 0 euros, pero como también sé que hay gente que le gusta colaborar (económicamente) con mi(s) sitio(s) (o conmigo para que siga manteniendo mis sitios), y eso de usar PayPal no les gusta mucho, he pensado que también habrá una versión de pago (algo simbólico, supongo que medio euro o un USD dólar o algo así).

    Ya te avisaré también… ¡que a todos nos hace falta seguir manteniéndonos! jeje

    Nos vemos.

    Guillermo

     

    Enlaces a los otros artículos de este "paso a paso":

    1. Usar un temporizador en las aplicaciones de Windows store (Visual Basic)
    2. Usar un temporizador en las aplicaciones de Windows store (C#)
    3. Pon una AppBar en tu aplicación de Windows Store
    4. Acceder a los recursos de una aplicación de Windows Store desde código (vb, c#, xaml)
    5. Actualizar el icono (tile) de una aplicación de Windows Store (cada minuto)
    6. Saber cuando la aplicación está en modo Snapped y actuar en consecuencia

    …

  • Windows Server 2012 usa la misma interfaz que Windows 8

    Pues eso… (de lo publicado en mi página de Facebook) el Windows Server 2012 (tanto el Standard como el Datacenter) usa la misma interfaz que Windows 8… o al menos tampoco tiene el menú de inicio…

    Esta captura es de una máquina virtual (Hyper-V en Windows 8 Pro) de la página "metrolizada" de inicio del Windows Server 2012 Standard…

     

    Windows Server 2012 Standard Star 2p

     

    Además en "el Desktop" tiene menos opciones que el Windows 8… ¿será porque es un  "servidor"? será, será, que diría mi amigo Juansa…

    Y es que los servidores están para lo que están… o deberían estar… en fin… yo que me había "ilusionado" pensando que el server no lo iban a convertir en metro-windows-sexual… así que… ¡habrá que ir acostumbrándose al metro!

     

    Por cierto, mirando en la página Getting started with Windows Store apps, dice esto otro:

    Important Windows Store app development is supported only on Windows 8. You can’t develop Windows Store apps on Windows 7 or Windows Server 2012.

    Osea que… habrá que centrarse en el Windows 8 y dejar al server para otros menesteres… ¿o no? ¡ya veremos! que esto sólo acaba de empezar…

     

    ¡Que lo metroalices bien!

     

    Nos vemos.
    Guillermo

    El post original en elGuille en Facebook

    …

  • Desinstalar VMware de un equipo con Hyper-V

    Pues eso, que después de hacer la conversión de mi equipo con Windows 7 en un disco virtual (VHD) y usar este en una máquina virtual usando el Hyper-V de Windows 8 Pro, me pongo a quitar las cosas que se suponen que ya no deben servir en esa máquina virtual, entre esas cosas están los "gestores de virtualización" (es decir, los programas para trabajar con máquinas virtuales), en mi caso tengo instalado (o tenía) el VMware Workstation (también vale para el VMware Player) y el VirtualBox.

    El VirtualBox se desinstaló sin problemas (aparentemente), pero el VMware no dejaba desinstalarse, ya que decía que el VMware no se puede instalar en una máquina virtual con Hyper-V. Es que el programa de desinstalación es el mismo que el de instalación y pasa lo que pasa…

    Buscando en Internet, entre otras cosas (que no me han servido o parecían muy rebuscadas) me he topado con este artículo: "Remove VMware Worstation or Player when Hyper-V is installed", y básicamente explica esto:

    Abre el archivo/fichero bootstrap.lua que estará en el directorio C:\ProgramData\VMware\VMware Workstation\Uninstaller, busca la cadena CheckForMSHyperV() y añádele dos guiones al principio (los guiones sirven de comentarios) y después te vas al programa de desinstalación de VMware y esta vez si que permitirá que lo desinstales.

     

    Espero que te haya (o sea en un futuro) de ayuda.

     

    Nos vemos.
    Guillermo

    P.S.

    En la KB de vmware hay otra entrada explicando lo mismo, pero algo más complicado… te lo digo por si esto que he explicado a ti no te vale, puede que esto otro sí:
    Cannot uninstall VMware Workstation running on a P2V machine running in Hyper-V

    El enlace anterior te llevará a este otro artículo:
    Cleaning up after an incomplete deinstallation on a Windows host

     

    P.S.2
    Después de desinstalar vmware es posible que se queden algunos directorios de datos, en mi caso tengo estos dos:
    C:\Users\username\AppData\Local\VMware\
    C:\Users\username\AppData\Roaming\VMware\

    Es posible que en el menú de inicio aún te quede la carpeta de VMware, compruébalo si existe el directorio VMware en este otro:
    C:\ProgramData\Microsoft\Windows\Start Menu\Programs\

    …