2010-10-20 11 views
2

Je suis en train de coder un panneau personnalisé représentant la main de cartes. C'est un panneau qui empilera les cartes horizontalement. S'il n'y a pas assez d'espace, chaque carte chevauchera une partie de la carte restante. La partie minimale devrait toujours être visible. J'ai accompli ceci et cela est le code:Problème de défilement personnalisé dans le panneau personnalisé

using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace Hand 
{ 
    public class Hand : Panel 
    { 
     //TODO Should be dependancy property 
     private const double MIN_PART = 0.5; 

     protected override Size MeasureOverride(Size availableSize) 
     { 
     Size desiredSize = new Size(); 
     foreach (UIElement element in this.Children) 
     { 
      element.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 

      desiredSize.Width += element.DesiredSize.Width; 
      desiredSize.Height = Math.Max(desiredSize.Height, element.DesiredSize.Height); 
     } 
     return desiredSize; 
     } 

     protected override Size ArrangeOverride(Size finalSize) 
     { 
     //percentage of the visible part of the child. 
     double part = 1; 

     Double desiredWidth = 0; 

     //TODO Check how to get desired size because without looping 
     //this.DesiredSize is minimum of available size and size returned from MeasureOverride 
     foreach (UIElement element in this.Children) 
     { 
      desiredWidth += element.DesiredSize.Width; 
     } 

     if (desiredWidth > this.DesiredSize.Width) 
     { 
      //Every, but the last child should be overlapped 
      double lastChildWidth = this.Children[this.Children.Count - 1].DesiredSize.Width; 
      part = (this.DesiredSize.Width - lastChildWidth)/(desiredWidth - lastChildWidth); 

      part = Math.Max(part, MIN_PART); 
     } 

     double x = 0; 

     foreach (UIElement element in this.Children) 
     { 
      Rect rect = new Rect(x, 0, element.DesiredSize.Width, element.DesiredSize.Height); 
      element.Arrange(rect); 
      finalSize.Width = x + element.DesiredSize.Width; 
      x += element.DesiredSize.Width * part; 
     } 

     return finalSize; 
     } 
    } 
} 

Je voudrais ajouter scrollbar quand une partie minimale est atteinte, de sorte que l'utilisateur pourrait encore être en mesure de voir toutes les cartes. Je ne peux pas accomplir cela. J'ai essayé avec le ScrollViewer comme ceci:

<Window x:Class="TestScrollPanel.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:h="clr-namespace:Hand;assembly=Hand" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ScrollViewer HorizontalScrollBarVisibility="Auto"> 
     <h:Hand> 
      <Button Width="100">One</Button> 
      <Button Width="150">Two</Button> 
      <Button Width="200">Three</Button> 
     </h:Hand> 
     </ScrollViewer> 
    </Grid> 
</Window> 

Mais cela ne fonctionne pas, car une fois barre de défilement horizontale est visible, MeasureOveride et ArrangeOverride du panneau à la main est jamais appelé et même si elle serait appelée, la main obtiendrait la taille désirée organiser tous les enfants sans chevauchement.

Cela pourrait-il être fait avec ScrollViewer du tout et sinon, d'autres idées seraient appréciées. Merci à tous pour votre aide.

Jurica

Répondre

2

Tout d'abord, changer votre logique de panneau pour tout le contraire: laisser emballer MeasureOverride les cartes aussi bien que possible, puis laisser ArrangeOverride les répartir uniformément sur tout la largeur est donnée.

Deuxièmement, utilisez la propriété MinWidth. Liez-le au ScrollViewer.ActualWidth. De cette façon, si les cartes peuvent être serrées dans une largeur inférieure à celle du ScrollViewer, alors votre Hand sera étiré à tout l'espace disponible. Et s'ils ne peuvent pas, alors la largeur de Hand sera juste ce que vous le calculez.

+0

Merci beaucoup. C'est la réponse que je cherchais. Très propre. La liaison n'était pas nécessaire, je crois, parce que cela fonctionne sans elle. –

+0

De rien. Content d'avoir pu aider. –

Questions connexes