Enlaces Interesantes WPF/Silverlight – 29/11/2009

Voy a intentar ir poniendo aquellos enlaces que encuentre en la red que sea interesantes dentro de las tecnologías de WPF/Silverlight, muchos serán en Ingles (por no decir el 99 %),

Aquí van los primeros

Como saber si el usuario tiene Silverlight instalado

Esta fue la pregunta que se hizo en los foros de MSDN, es una pregunta interesante porque puede que nos interese redirigir automáticamente al usuario que no tiene instalado Silverlight a una pagina nuestra en formato HTML sin tener que obligarle a instalar Silverlight para ver nuestra pagina y perder un visitante que no quiere instalarse el plugin.

La manera de comprobarlo es a través de JavaScript

 

 

function isSilverlightInstalled()

{

    var isSilverlightInstalled = false;

    

    try

    {

        //check IE

        try

        {

            var slControl = new ActiveXObject('AgControl.AgControl');

            isSilverlightInstalled = true;

        }

        catch (e)

        {

            //Checkeamos Firefox

            if ( navigator.plugins["Silverlight Plug-In"] )

            {

                isSilverlightInstalled = true;

            }

        }

    }

    catch (e)

    {

        

    }

    return isSilverlightInstalled;

}

A disfrutarlo

Seesmic en WPF para Windows

El popular cliente de Twitter Seesmic se ha movido de Adobe Air a la tecnología WPF para los clientes Windows y en un futuro muy proximo piensan sacar la versión en SilverLight para el resto de plataformas. Esto fue anunciado en el pasado PDC por el CEO de Seesmic, al que se le pregunto la razón del cambio y contesto que el nuevo cliente era mas rápido y usaba menos memoria (supongo que será también un tema de pasta).

Le Meur (CEO de Seesmic) explica en su Blog las características de Seesmic para WPF, si quieres irla probando únete al equipo de Team Seesmic para ser un Beta Tester

 

GroupFooter en ListView

En una de las preguntas de los foros, se comentaba a ver si era posible en una listview hacer un footer para indicar totales en una ListView, la verdad que no es muy complicado de realizar aprovechándonos de la propiedad ContainerStyle para GroupStyle, a continuación voy a poner el código de ejemplo.

El XAML de la ventana seria

 

  1. <Window x:Class=»WpfApplication5.Window1″
  2.    xmlns=»http://schemas.microsoft.com/winfx/2006/xaml/presentation»
  3.    xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml»
  4.    xmlns:local=»clr-namespace:WpfApplication5″
  5.    Title=»Window1″ Width=»640″ Height=»480″>
  6.     <Window.Resources>
  7.         <local:MyDataSource x:Key=»MyData» />
  8.         <CollectionViewSource x:Key=»ViewSource» Source=»{Binding Source={StaticResource MyData}, Path=Users}»>
  9.             <CollectionViewSource.GroupDescriptions>
  10.                 <PropertyGroupDescription PropertyName=»Country» />
  11.             </CollectionViewSource.GroupDescriptions>
  12.         </CollectionViewSource>
  13.     </Window.Resources>
  14.     <Grid x:Name=»LayoutRoot»>
  15.         <ListView ItemsSource=»{Binding Source={StaticResource ViewSource}}»>
  16.             <ListView.GroupStyle>
  17.                 <GroupStyle>
  18.                     <GroupStyle.ContainerStyle>
  19.                         <Style TargetType=»{x:Type GroupItem}»>
  20.                             <Setter Property=»Template»>
  21.                                 <Setter.Value>
  22.                                     <ControlTemplate TargetType=»{x:Type GroupItem}»>
  23.                                         <DockPanel>
  24.                                             <Grid DockPanel.Dock=»Bottom»>
  25.                                                 <Grid.Resources>
  26.                                                     <local:TotalSumConverter x:Key=»sumConverter» />
  27.                                                 </Grid.Resources>
  28.                                                 <Grid.ColumnDefinitions>
  29.                                                     <ColumnDefinition Width=»*» />
  30.                                                     <ColumnDefinition Width=»*» />
  31.                                                 </Grid.ColumnDefinitions>
  32.                                                 <Grid.RowDefinitions>
  33.                                                     <RowDefinition />
  34.                                                     <RowDefinition />
  35.                                                 </Grid.RowDefinitions>
  36.                                                 <StackPanel Orientation=»Horizontal»>
  37.                                                     <TextBlock Grid.Column=»0″ Text=»Total: « FontWeight=»Bold»/>
  38.                                                     <TextBlock Grid.Column=»0″ Text=»{Binding Path=Name}» />
  39.                                                 </StackPanel>
  40.                                                 <Line Grid.Column=»1″ Stroke=»Black» X2=»500″ Fill=»Black» VerticalAlignment=»Center» />
  41.                                                 <TextBlock Grid.Row=»1″ Grid.Column=»1″ HorizontalAlignment=»Right» Text=»{Binding Path=Items, Converter={StaticResource sumConverter}}» />
  42.                                             </Grid>
  43.                                             <ItemsPresenter />
  44.                                         </DockPanel>
  45.                                     </ControlTemplate>
  46.                                 </Setter.Value>
  47.                             </Setter>
  48.                         </Style>
  49.                     </GroupStyle.ContainerStyle>
  50.                 </GroupStyle>
  51.             </ListView.GroupStyle>
  52.             <ListView.View>
  53.                 <GridView>
  54.                     <GridViewColumn Width=»140″ Header=»Nombre» DisplayMemberBinding=»{Binding Name}»/>
  55.                     <GridViewColumn Width=»140″ Header=»Telefono» DisplayMemberBinding=»{Binding Phone}»/>
  56.                     <GridViewColumn Width=»140″ Header=»Ciudad» DisplayMemberBinding=»{Binding Country}» />
  57.                     <GridViewColumn Width=»140″ Header=»Total» DisplayMemberBinding=»{Binding Total}» />
  58.                 </GridView>
  59.             </ListView.View>
  60.         </ListView>
  61.     </Grid>
  62. </Window>

 

Si os fijais hemos definido el estilo para GroupStyle y hemos indicado porque propiedad se agrupa en CollectionViewSource, luego hemos definido como queríamos representar ese pie, en este caso vamos a mostrar la suma de todos los items de ese grupo

Ahora vamos a seguir poniendo el código de las restantes clases necesarias

MyDataSource.cs

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Text;
  6. namespace WpfApplication5
  7. {
  8.     public class MyDataSource
  9.     {
  10.         public ObservableCollection<User>
  11.             Users { get; set; }
  12.         public MyDataSource()
  13.         {
  14.             Users = new ObservableCollection<User>();
  15.             LoadDummyData();
  16.         }
  17.         private void LoadDummyData()
  18.         {
  19.             Users.Add(new User() { Name = «Oscar», Phone = «(122) 555-1234», Country = «España», Total = 432 });
  20.             Users.Add(new User() { Name = «Maite», Phone = «(212) 555-1234», Country = «España», Total = 456 });
  21.             Users.Add(new User() { Name = «Javi», Phone = «(301) 555-1234», Country = «España», Total = 123 });
  22.             Users.Add(new User() { Name = «Joseba», Phone = «+33 (122) 555-1234», Country = «USA», Total = 333 });
  23.             Users.Add(new User() { Name = «Mike», Phone = «+33 (122) 555-1234», Country = «USA», Total = 222 });
  24.             Users.Add(new User() { Name = «Jim», Phone = «+33 (122) 555-1234», Country = «USA», Total = 444 });
  25.         }
  26.     }
  27. }

User.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace WpfApplication5
  6. {
  7.     public class User
  8.     {
  9.         public string Name { get; set; }
  10.         public string Phone { get; set; }
  11.         public string Country { get; set; }
  12.         public double Total { get; set; }
  13.     }
  14. }

TotalSumConverter.cs

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Windows.Data;
  7. namespace WpfApplication5
  8. {
  9.     public class TotalSumConverter : IValueConverter
  10.     {
  11.         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  12.         {
  13.             var users = value as IEnumerable<object>;
  14.             if (users == null)
  15.                 return «€0.00»; double sum = 0;
  16.             foreach (var u in users)
  17.             {
  18.                 sum += ((User)u).Total;
  19.             } return sum.ToString(«c»);
  20.         }
  21.         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  22.         { throw new System.NotImplementedException(); }
  23.     }
  24. }

 

El resultado final seria

 

image

Fácil no?, espero que os sirva

Microsoft Surface SDK WE disponible para Subscritores de MSDN

Hola, hace tiempo que esperaba con ganas esta noticia, por fin los mortales que no hemos podido tener una Surface para desarrollar para ella,  tenemos la oportunidad de poder desarrollar para ella sin tenerla. Por fin podre aprovechar mi HP TouchSmart al completo con WPF 4.0 y este SDK, no será lo mismo que una Surface pero se me quitara el mono

MSDN Subscribers

 

 

 

 

 

 

 

 

 

 

 

 

 

A disfrutarla!!!!!

Memory Leak en un TextBox de WPF

Llevo tiempo sin escribir y voy a intentar volver a la carga si el trabajo me deja, hoy quisiera comentaros una “fuga de memoria” que se les producía  a unos compañeros míos. El problema se les daba en un TextBox en el que el usuario introducía un montón de información y detectaban que el consumo de memoria se les disparaba.

El problema en este caso es sencillo ya que esta reportado por Microsoft, para que funcione el Undo en el TextBox por dentro implementa una pila Undo Stack en el que va guardando todos los cambios que se producen en el TextBox para que el usuario pueda hacer Undo. Imaginaros la cantidad de memoria que consume esa pila por cada pulsación de tecla, la manera de “solucionarlo” es utilizar la propiedad UndoLimit del TextBox que por defecto viene a –1, aquí indicamos el limite de eventos de Undo que queremos, en este caso el valor por defecto es –1, lo que quiere decir infinito.

Para solucionarlo solo pusimos la propiedad UnLimit con el valor 0 (en este caso nos interesaba que no tuviera Undo)

 

<Application.Resources>  
        <Style TargetType="{x:Type TextBox}"> 
            <Setter Property="UndoLimit" Value="0" /> 
        </Style> 
    </Application.Resources> 

Espero que os ayude y tengais cuidado