3

Je travaille sur une galerie de photos pour Windows Phone 7 et j'essaie d'obtenir que chaque image prenne l'écran et glisse horizontalement. Ce que je fais jusqu'à présent est d'utiliser une listbox que j'ai modifiée pour faire défiler horizontalement mais le problème est que je n'arrive pas à trouver un moyen de lier la largeur et la hauteur de ListboxItem avec les paramètres ActualWidth et ActualHeight du Listbox lui-même. La raison pour laquelle je veux faire cela est que si l'orientation du téléphone change, la taille des photos changerait aussi bien pour s'adapter à l'écran.Silverlight - Liaison Listbox ActualWidth à ListboxItem Width

Voici le code que j'ai jusqu'à présent (je l'ai essayé d'utiliser TemplatedParent et RelativeSource mais je dois faire quelque chose de mal, car il ne fonctionne pas du tout):

<Style x:Key="PhotoGalleryItem" TargetType="ListBoxItem"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="BorderThickness" Value="0"/> 
    <Setter Property="Padding" Value="0"/> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ListBoxItem"> 
       <Grid x:Name="ListBoxItemRoot" HorizontalAlignment="Stretch" Margin="4,0,4,0" Width="{Binding RelativeSource={RelativeSource TemplatedParent},Path=ActualWidth}"> 
        <Image Source="{Binding Mode=OneWay}" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style TargetType="controls:PhotoGallery"> 
    <Setter Property="Background" Value="Red"/> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled"/> 
    <Setter Property="BorderThickness" Value="0"/> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="Padding" Value="0"/> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="controls:PhotoGallery"> 
       <Border BorderBrush="Transparent" BorderThickness="0" > 
        <Grid x:Name="LayoutRoot" Background="{TemplateBinding Background}"> 
         <ScrollViewer x:Name="Scroller" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden" > 
           <ItemsPresenter/> 
         </ScrollViewer> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="ItemContainerStyle" Value="{StaticResource PhotoGalleryItem}" /> 
</Style> 

Toute idée sur comment atteindre ce résultat?

Merci

+0

Avez-vous d'ajouter le code suivant au constructeur de votre page d'application? SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape; –

Répondre

0

cela peut être similaire à cette question I asked before

Add HorizontalContentAlignment="Stretch" to your ListBox. 
That should do the trick. 

Je vois que vous avez déjà « HCA » set avec un compositeur, donc je ne sais pas exactement ce qui se passe.

+0

Cela ne fonctionne malheureusement pas – swinefeaster

+0

peut-être pas sur WP7 - Je pense que c'est le cas sur Windows –

0

Vous pouvez le faire dans le code:

public static void bindItemWidthToListBoxWidth(FrameworkElement cell) 
{ 
    ListBox parent = findListBoxParent(cell); 
    if(parent != null) 
    { 
    Binding binding = new Binding(); 
    binding.Source = parent; 
    binding.Path = new PropertyPath("ActualWidth"); 
    binding.Mode = BindingMode.OneWay; 

    cell.SetBinding(Grid.WidthProperty, binding); 
    } 
} 

public static ListBox findListBoxParent(DependencyObject el) 
{ 
    ListBox retValue = findAncestor<ListBox>(el); 
    return retValue; 
} 

public static tType findAncestor<tType>(DependencyObject el) 
    where tType : DependencyObject 
{ 
    tType retValue = null; 

    DependencyObject parent = VisualTreeHelper.GetParent(el); 

    if(parent != null) 
    { 
    if (parent is tType) 
    { 
     retValue = (tType)parent; 
    } 
    else 
    { 
     retValue = findAncestor<tType>(parent); 
    } 
    } 

    return retValue; 
}