Chronos v2.0 Beta 3 available for download


Release notes:

  • Updated introduction document.
  • Updated Visual Studio 2010 Extension (vsix) package.
  • Added horizontal scrolling to the main window TaskBar.
  • Added new styles for ListView, ListViewItem, GridViewColumnHeader, …
  • Added a new WindowViewModel class (allowing to fetch data).
  • Added a new Navigate method (with several overloads) to the NavigationViewModel class (protected).
  • Reimplemented Task usage for the WorkspaceViewModel.OnDelete method.
  • Removed the reflection effect from the shortcut style.
  • Removed the shadow effect from Widgets and Windows.
  • Removed opacity effect when a window or widget is deactivated (instead the header progressbar will change its color).
  • Changed the header rectangle, on Windows and Widgets, by a progressbar that will become in indeterminate state when the window ViewMode is set to Busy, the progressbar gets filled with solid colors instead of the gradients used in the old rectangle.
  • Changed Window Visibility to Collapsed when minimized.
  • Changed Workspace Window style ZoomView popup StayOpen property value to false.
  • Renamed all window styles, and added new ones.
  • Renamed all widget styles.

Evolución del estilo visual de Chronos


Hoy por curiosidad me he puesto a revisar las imágenes antiguas que hay en el blog, de Chronos, y ver como ha ido evolucionando visualmente y la verdad es que ha cambiado mucho.

  • Mayo 2009

Chronos200905

  • Agosto 2009

Chronos200908

  • Noviembre 2009

Chronos200911

  • Diciembre 2009

Chronos200912

  • Enero 2010

Chronos201001

  • Febrero 2010

Chronos201002

  • Noviembre 2010

Untitled

Chronos 2.0 Beta 2 available for download


Release Notes

  • Added cached composition on windows & widgets for Render Tier 0/1 machines (this should help to improve window & widget dragging performance).
  • Added a simple widget configuration system.
  • Metro theme design time fixes & improvements
  • Restyled login window with a zune-like style.
  • Shell window header changes to bring it to front when the mouse is over it
  • Bug Fixes.

The download is available here.

WPF 4 Cached composition tests with Chronos


I have been doing some tests with the WPF 4 cached composition in chronos as a way of try to improve performance when dragging windows and widgets on Render Tier 1 machines.

Using cached composition on windows and widgets improves the dragging performance dramatically, but, the text maybe rendered a bit blurry, while it remains perfectly readable (it’s the first time i use the cached composition support of WPF 4 so maybe i have done something wrong).

I have done the test on a Rendering Tier 1 machine with Windows XP at 1280×1024, using two fonts:

  • Segoe WP (It’s the default font on Chronos v2.0)
  • Segoe UI.

The Cache mode property in the WorkspaceWindowStyle and WidgetStyle styles has been set as:

<BitmapCache EnableClearType="True" RenderAtScale="1" SnapsToDevicePixels="True" />

And finally the TextFormatting mode has been set as Display for one of the tests.

<Setter Property="TextOptions.TextFormattingMode" Value="Display" />

The screenshots shows the Chronos Navigator widget

  • Without using cached composition.
  • Using Cached composition.
  • Using Cached composition and the Display Text Formatting mode.

Here are the results when using Segoe WP.
CachedComposition-Segoe WP
And here when using Segoe UI.

CachedComposition-Segoe UI

Text rendering was better when using Segoe UI font, but that was expected.

Hope i will include cached composition support on widgets and windows in the Beta 2 of Chronos for  Rendering Tier 1 machines.

Update: Test on Rendering Tier 2 machine, Windows 7 at 1920×1200, using the Magnifier Tool at 300%, using Segoe WP font

CachedCompositionT2

Chronos WPF 2.0 Beta 1 available for download


Release Notes

Chronos v2.0 Beta 1

  • Metro theme
  • New Digital clock Widget
  • Solution reorganization
  • Changes on MVVM support
  • Logging support changed to use NLog
  • Improved XML documentation comments
  • Lots of minor changes & refactorings

Source code, binaries, introduction document and ClickOnce installer are available here

 

chronos: escritorios virtuales


Aprovechando los cambios que he estado haciendo la última seana para replantear una parte de chronos (tengo pendiente escribir un post sobre el tema), estos dos últimos dias he aprovechado para implementar los escritorios virtuales (bueno va a dar soporte a dos escritorios solamente por el momento).

El diagrama de clases para los escritorios virtuales queda así (por el momento)

image

En la ventana principal los escritorios se registran como escritorios virtuales así

<desktopControls:Desktop
        x:Name="VirtualDesktop01"
        Grid.Row="3"
        Id="94fa801f-bef7-437a-ba75-352f1ede6fb9"
        Visibility="Collapsed"
        windows:VirtualDesktopManager.IsDesktop="True"
        dragdrop:DragDropManager.IsDropTarget="True"
        Background="Transparent"
        AllowDrop="True"
        SnapsToDevicePixels="True"
        ClipToBounds="False">
</desktopControls:Desktop>

<desktopControls:Desktop
        x:Name="VirtualDesktop02"
        Grid.Row="3"
        Id="2afc760e-9450-448d-9f28-5311c49e4773"
        Visibility="Collapsed"
        windows:VirtualDesktopManager.IsDesktop="True"
        dragdrop:DragDropManager.IsDropTarget="True"
        Background="Transparent"
        AllowDrop="True"
        SnapsToDevicePixels="True"
        ClipToBounds="False">
</desktopControls:Desktop>

El Id servirá para identificar, internamente, una instancia concreta de un escritorio y el nombre se utilizará para el archivo que se generará al guardar el escritorio.

La “dependency property” VirtualDesktopManager.IsDesktop se

encargará de registrar el escritorio virtual.

El ViewModel de la ventana principal tiene un nuevo comando para cambiar de escritorio

public ICommand SwitchDesktopCommand
{
    get
    {
        if (this.switchDesktop == null)
        {
            this.switchDesktop = new ActionCommand(() => OnSwitchDesktop());
        }

        return this.switchDesktop;
    }
}

que se encargará de realizar el cambio de la siguiente forma

/// <summary>
/// Handles the switch desktop command action
/// </summary>
private void OnSwitchDesktop()
{
    ServiceLocator.GetService<IVirtualDesktopManager>().SwitchDesktop();
}

La clase VirtualDesktopManager está declara como un servicio de nRoute


[MapService(typeof(IVirtualDesktopManager),
    InitializationMode=InitializationMode.WhenAvaliable,
    Lifetime=InstanceLifetime.Singleton)]
public sealed class VirtualDesktopManager : ObservableObject, IVirtualDesktopManager

tiene métodos para, cambiar de escritorio, activar el escritorio por defecto (que por el momento será siempre el primero registrado), visualizar una ventana, widget o acceso directo en el escritorio activo, etc. En general los métodos de esta clase se limitan a llamar a los métodos equivalentes de la clase que representa el escritorio virtual (que debe ser una instancia de VirtualDesktop).

Ahí va un video mostrando el cambio de escritorio (está grabado con camstudio, la calidad no es muy buena … pero como ejemplo debería ser más que suficiente)