2017-07-11 2 views
0

J'ai créé une classe et je l'ai héritée du panneau de classe et lui ai ajouté du contenu, mais pour une raison inconnue, la fenêtre ne compte pas pour le contenu et la hauteur et la largeur de la fenêtre sont définies à zéro. Les tailles de la fenêtre sont définies automatiquement.Custom Panel WPF

SizeToContent = "WidthAndHeight" 

Si vous prenez une grille simple alors tout va bien. Voici ma classe

public class Field : Panel 
    { 
     static Field() 
     { 

     } 

     protected override Size MeasureOverride(Size availableSize) 
     { 
      Size size = new Size(double.PositiveInfinity, double.PositiveInfinity); 
      foreach (UIElement element in base.InternalChildren) 
       element.Measure(size); 
      return new Size(); 
     } 

     protected override Size ArrangeOverride(Size arrangeSize) 
     { 
      foreach (UIElement element in InternalChildren) 
      { 
       Rect bounds = new Rect(new Point(0,0), element.DesiredSize); 
       element.Arrange(bounds); 
      } 
      return arrangeSize; 
     } 
     public void CreateField(Field element) 
     { 
      element.Children.Add(new Cell()); 
     } 
    } 

Aide S'il vous plaît!

+1

Dans MeasureOverride(), vous renvoyez new Size(), ce qui n'a pas de sens. –

Répondre

0

Afin de prendre en charge SizeToContent, votre méthode MeasureOverride doit renvoyer la taille finale souhaitée du Panel après la mise en page. Dans votre exemple, il s'agit simplement de la largeur et de la hauteur maximales de ses enfants:

protected override Size MeasureOverride(Size availableSize) 
{ 
    var measuredSize = new Size(); 

    foreach (UIElement element in InternalChildren) 
    { 
     element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 

     var elementSize = element.DesiredSize; 

     measuredSize.Width = Math.Max(measuredSize.Width, elementSize.Width); 
     measuredSize.Height = Math.Max(measuredSize.Height, elementSize.Height); 
    } 

    return measuredSize; 
}