Animar Visibility en Silverlight

Las animaciones es una de las características que encuentro más interesantes en WPF.

Si alguna vez se te plantea la animación de propiedades de un control de ventana tienes que usar el ObjectAnimationUsingKeyFrames.

Si tu caso es animar la propiedad Visibility aqui tienes un ejemplo que he encontrado en el link que tienes en más información pero mira bien porque no es la respuesta marcada como correcta.

<Storyboard x:Name="VisStory">
    <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="(UIElement.Visibility)">
     <DiscreteObjectKeyFrame KeyTime="00:00:00">
      <DiscreteObjectKeyFrame.Value>
       <Visibility>Collapsed</Visibility>
      </DiscreteObjectKeyFrame.Value>
     </DiscreteObjectKeyFrame>
     <DiscreteObjectKeyFrame KeyTime="00:00:01">
      <DiscreteObjectKeyFrame.Value>
       <Visibility>Visible</Visibility>
      </DiscreteObjectKeyFrame.Value>
     </DiscreteObjectKeyFrame>
    </ObjectAnimationUsingKeyFrames>
</Storyboard>

 

Más información

Visibility animation

 

Bing Maps Draggable Pushpin

Bing maps està completament integrat a les tecnologíes de .Net com ASP.NET, WPF, Silverlight i Windows Phone. L’ús de la API és molt senzill.

Per començar a treballar amb ella primer necessites descarregar-te l’SDK de Bing Maps i aconseguir la teva clau de desenvolupador gratuitament.

Tota la informació i els passos a seguir els trobeu aqui: Bing Maps for Developers

En el cas que m’ocupa aquesta entrada vull parlar del control Pushpin de l’espai de noms Microsoft.Phone.Controls.Maps en Windows Phone.

Des de la pàgina de Microsoft pots trobar la informació de com es treballa amb els Pushpins i creume que no és gens complicat. Aqui tens una part de codi amb XAML que et permet incloure una llista de Pushpins enllaçada a una font de dades.

<my:Map  Name="map1" ZoomBarVisibility="Visible" ZoomLevel="16" Center="{Binding Location}">
    <my:MapLayer Visibility="{Binding VisibilityLayer}">
       <my:MapItemsControl ItemsSource="{Binding LlistaPushpins}">
           <my:MapItemsControl.ItemTemplate>
              <DataTemplate>
                <my:Pushpin Content="{Binding Contingut}" Location="{Binding Location}" >
                </my:Pushpin>
              </DataTemplate>
           </my:MapItemsControl.ItemTemplate>
       </my:MapItemsControl>
    </my:MapLayer>
</my:Map>

El que no et fa la SDK estàndard del Bing és poder arrosegar un Pushpin de un punt a un altre del mapa. Per sort la comunitat ja ha resolt aquest problema i penso jo d’una manera molt nítida si ens fixem en la resolució proposada al següent enllaç:

Draggable PushPins

Simplement es tracta de crear una clase que hereda de Behavior<Pushpin> que s’adjunta a l’event MouseLeftButtonDown per accedir a la propietat Location del Pushpin i assignar-l’hi la posició del mouse respecte l’area que ocupa el mapa.

El codi en XAML que has d’utilitzar després és simplement:

<my:Map  Name="map1" ZoomBarVisibility="Visible" ZoomLevel="16" Center="{Binding Location}">
<my:MapLayer >
     <my:Pushpin Location="{Binding Location,Mode=TwoWay}" Style="{StaticResource PushpinStyle2}" >
          <interactivity:Interaction.Behaviors>
               <behavior:DraggablePushpin />
          </interactivity:Interaction.Behaviors>
     </my:Pushpin>
</my:MapLayer>
</my:Map>

El resultat és el següent si seguim el que indica el post que faig referència:

1) Punt inicial del Pushpin

2) Desplaçar per el mapa (Drag)

3) Avís de canvi de ubicació

4) Pushpin canviat

Més informació:

Draggable PushPins

Draggable Pushpins using Bing Maps Silverlight Control

ObjectDataSource y Guid

Trabajando como siempre he tenido la necesidad de utilizar un ObjectDataSource para leer los datos de un WCF Data Services. Los datos leídos contienen una columna de tipo Guid que es un tipo de datos que contiene valores únicos e irrepetibles.

Este valor en mi caso viene parametrizado y siguiendo el Wizard del ObjectDataSource y sin generar ningún tipo de error se produce el siguiente error de ejecución:

“Object must implement IConvertible”

Este error que no es muy informativo viene dado por el parámetro Guid.

En el código fuente del .aspx en lugar de

"< name="myGuid">"

debemos escribir

"< name="myGuid" type="String">"

Y con eso ya no tendremos ningún problema.

Tal y como dice el bloggero del siguiente link, yo no he malgastado un dia entero buscando la solución pero si unas baluosas horas.

How to pass Guid variable to ObjectDataSource ?

Más información

Guids are not very guid! Updating in DetailsView,FormView (Object must implement IConvertible)

ApplicationBarIcon sense Command a Windows Phone

Existeix el model MVVM (Model-Vista-Vista Model) que és realment pràctic quan desenvolupem aplicacions amb WPF o Silverlight i ara també amb Windows Phone. Aquest patró entre altres coses et permet separar les dades de la interfície de manera que el codi associat a una Window, Page, usercontrol o PhoneApplicationPage sol estar pràcticament en blanc ja que gràcies al model d’enllaç de dades els controls de la pantalla s’enllacen a una instància de classe que té les dades. Mireu l’exemple del model MVVM que et dóna Microsoft.

Pel que fa a les accions generades per l’usuari enlloc de tractar els events dels diferents controls s’utilitza el patró Command que a part de ser senzill és molt útil per gestionar quant un control està disponible per ser premut o no.

Amb aplicacions per Windows Phone 7 i 7.5 existeix un control anomenat ApplicationBar que és el que apareix a la part inferior de tota app.

Aquest control conté botons o icones que l’usuari pot interactuar. Aquests icones s’anomenen ApplicationBarIconButton.

ApplicationBarIconButton no té l’atribut Command i per tant estem obligats a per força tractar l’event click d’aquests botons. Personalment penso que és una pena però és així. Dic que és una pena perquè el model Command té la possibilitat de poder dir al botó si està en propietat Enabled o no, de manera que és la pròpia app qui sap quan es pot prémer un botó o no.

En aquest cas, hem de fer-ho nosaltres personalment. La meva recomanació és utilitzar igualment el model MVVM i des del codi associat a la PhoneApplicationPage modificar el valor de la propietat IsEnabled adequadament.

Seria una cosa semblant a :

PublishAppButton.IsEnabled = (DataContext as ViewModel.MainPageViewModel).PublishCommand.CanExecute(null);

Però els problemes no s’han acabat. Resulta que ApplicationBar no és FrameworkElements i no es pot trobar el control botó dins la llista d’elements del control ApplicationBar.

Per sort, sempre tenim un workaround.

PublishAppButton = ApplicationBar.Buttons[0] as Microsoft.Phone.Shell.ApplicationBarIconButton;
PublishAppButton.IsEnabled = (DataContext as ViewModel.MainPageViewModel).PublishCommand.CanExecute(null);

Tenim que accedir per posició d’array a la propietat Buttons del control ApplicationBar.

Aquest seria el seu XAML associat:

<phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
            <shell:ApplicationBarIconButton IconUri="/Icons/appbar.save.rest.png" Text="Publish" Click="ApplicationBarIconButton_Click_2" />
        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>

Per la execució de la comanda associada és tal i com indica el següent tros de codi:

private void ApplicationBarIconButton_Click_2(object sender, EventArgs e)
{             
  if ((DataContext as ViewModel.MainPageViewModel).PublishCommand.CanExecute(null))                 
     (DataContext as ViewModel.MainPageViewModel).PublishCommand.Execute(null);
}