2017-01-10 6 views
0

У меня есть куча предметов в панели с одинаковой высотой. Я хочу, чтобы элементы на панели уменьшали ширину на основе максимальной ширины самой панели.Как вы нажимаете дочерние элементы на пользовательской панели до определенного размера?

Например - Ширина панели 400, у вас есть 4 элемента на панели, каждый элемент получает ширину 100. Если бы это было 2 предмета, каждый элемент был бы 200 ширины.

После звонка child.Measure во второй раз с ожидаемой шириной элемента, child.DesiredSize полностью изменяется на что-то еще. Как заставить элемент взять ширину, которую я ему даю?

public class DynamicShrinkPanel : StackPanel 
{ 
    public DynamicShrinkPanel() 
    { 
    } 

    protected override Size MeasureOverride(Size constraint) 
    { 
     Size desiredSize = new Size(); 
     foreach (UIElement child in InternalChildren) 
     { 
      // First call to get the desired size. 
      child.Measure(constraint); 
      double properChildWidth = constraint.Width/InternalChildren.Count; 
      // Second call to set what I want, doesn't do what I expect 
      child.Measure(new Size(properChildWidth, child.DesiredSize.Height)); 
      desiredSize.Height = child.DesiredSize.Height; 
      desiredSize.Width += child.DesiredSize.Width; 
     } 

     return desiredSize; 
    } 
} 
+1

звучит, как вы можете использовать '' UniformGrid' с Строк = «1» ' – ASh

+0

правых, не написать пользовательскую панель для этого. Вместо этого используйте UniformGrid. – Clemens

+0

UniformGrid не занимает полную ширину элемента управления, в который он вложен автоматически. Поэтому в моем случае, если доступная ширина равна 500, она будет использовать все 500, независимо от того, сколько или нескольких элементов вы положили в нее. Равномерная сетка, по-видимому, занимает как можно меньше места. – user99999991

ответ

0

Я понял это, не используйте MeassureOverride вычислить точный размер, а скорее метод ArrangeOverride.

protected override Size MeasureOverride(Size constraint) 
{ 
    Size desiredSize = new Size(); 
    foreach (UIElement child in InternalChildren) 
    { 
     child.Measure(constraint); 
     desiredSize.Height = child.DesiredSize.Height; 
     desiredSize.Width = constraint.Width; 
    } 

    return desiredSize; 
} 

protected override Size ArrangeOverride(Size arrangeSize) 
    { 
     double offset = 0; 
     double properWidth = arrangeSize.Width/InternalChildren.Count; 
     foreach (UIElement child in InternalChildren) 
     { 
      child.Arrange(new Rect(offset, 0, properWidth, arrangeSize.Height)); 
      offset += properWidth; 
     } 

     return arrangeSize; 
    }