Vem är Johan Lindfors

Jag jobbar som teknisk chef på Microsoft i Sverige och ansvarar för vår tekniska evangelisering mot utvecklare. I den här bloggen har jag för avsikt att skriva om utveckling i allmänhet och på Microsofts plattform i synnerhet.

Är du intresserad av en XNA användargrupp?



Visa resultat!

Get Microsoft Silverlight

Hantera synlighet av element baserat på orientering

En dialog som nyss dök upp i en diskussionslista var angående hur det går att agera på förändring i orientering av enheten som då kan uppdatera gränssnittet. Med Windows Phone 7 och Silverlight så kan du markera dina sidor i en applikation till att ha stöd för både Portrait (stående) och Landscape (liggande) eller bara en av dem om så önskas. Med hjälp av de inbyggda panelerna så kommer sedan elementen i din applikation att automatiskt ställa in sig till skärmens orientering, mycket smidigt, men det finns begränsningar.

Exempelvis kalkylatorn i Windows Phone 7, har liksom kalkylatorer i andra plattformar, mer knappar synliga vid liggande orientering än vid stående. Men hur kan vi i våra applikationer förändra ett elements synlighet baserat på orientering?

Databinding och “value-converters” till räddningen.

Genom att helt enkelt databinda det element som vi vill ska kunna synas eller inte, specifikt egenskapen Visibility, till egenskapen på sidan som heter Orientation. Dessvärre så har dessa egenskaper olika typer och det är där en konverterare kommer till sin rätt. Följande kod skapar en en-vägs-konverterare (i och med att jag inte implementerar ConvertBack metoden) som hanterar konverteringen:

public class LandscapeVisibilityConverter : IValueConverter
{
    public object Convert(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        var orientation = (PageOrientation)value;
        Visibility visibility = Visibility.Collapsed;
        switch (orientation)
        {
            case PageOrientation.Landscape:
            case PageOrientation.LandscapeLeft:
            case PageOrientation.LandscapeRight:
                visibility = Visibility.Visible;
                break;
            default:
                break;
        }
        return visibility;
    }

    public object ConvertBack(
        object value, 
        Type targetType, 
        object parameter, 
        CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Hoppas att du får användning av den! Det är precis lika enkelt att skapa en PortraitVisibilityConverter, men det fixar du själv va, eller hur Smile

Postades 16. juni 2010 23:08 av Johan Lindfors

Kommentarer

2010-06-17 07:13:34 #

Ett annat alternativ är att styra detta med styles istället. Här är ett simplifierat exempel där en StackPanel agerar LayoutRoot och man kan sätta om Orientation till Horizontal eller Vertical och baserat på det styra om TextBlock ska vara synliga eller inte. Man skulle enkelt modifiera denna till att kolla PageOrientation istället.

<StackPanel Orientation="Horizontal">
  <StackPanel.Resources>
    <Style x:Key="LandscapeVisible" TargetType="{x:Type FrameworkElement}">
      <Setter Property="Visibility" Value="Collapsed"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel}}, Path=Orientation}" Value="Horizontal">
    <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
    <Style x:Key="PortraitVisible" TargetType="{x:Type FrameworkElement}">
      <Setter Property="Visibility" Value="Collapsed"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel}}, Path=Orientation}" Value="Vertical">
          <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </StackPanel.Resources>
  <TextBlock Style="{StaticResource LandscapeVisible}" Text="Visible in landscape view"/>
  <TextBlock Style="{StaticResource LandscapeVisible}" Text="Visible in landscape view"/>
  <TextBlock Style="{StaticResource PortraitVisible}" Text="Visible in portrait view"/>
</StackPanel>

Jonas Cannehag Sweden | Reply

2010-06-17 07:36:06 #

Snyggt exempel Jonas, dessvärre så finns det inget stöd för just triggers i Silverlight (ditt exempel var baserat på WPF eller hur?). Det blir till att skriva lite kod för att reagera på aktuell händelse.

JohanLindfors Sweden | Reply

2010-06-17 08:09:06 #

Helt riktigt är det baserat på WPF. Jag är lite osäker på vad som finns och inte finns i Silverlight. Jag gjorde några testskott med en SL app för ett tag sedan och stötte genast på patrull med saker som inte fanns som jag är van vid från WPF-världen Smile

Finns det inte stöd för några som helst triggers i Styles i SL?

Jonas Cannehag Sweden | Reply

2010-08-15 16:07:21 #

Beitg great, very informative. Have your blog directly times further recommends. Good work.

Free SMS Germany | Reply

Lägg till kommentar




  Country flag

biuquote
  • Kommentar
  • Live överblick
Loading



Den här bloggen använder BlogEngine.NET 1.6.0.0
Temat anpassat av Johan Lindfors