在ItemsControl上消失的边框resize(使用“stretchpanel”)

昨天我问到如何让一个ItemsControl让它的孩子在可用空间内平均分配; 在愉快地阅读答案之后,我写了(实际上有点复制和调整它)我自己的“拉伸面板”,它完全符合我的要求。 然而,我的孩子应该在他们的右侧有一个边界,只要孩子的内容大于其内容就行。 一旦它变小,边界消失,我不知道为什么(因此,不解决它)。 下面您可以使用此示例作为基础,从我的stretchpanel中找到我的视图的简化版本和覆盖方法。 非常感谢提前。

      Test Test This demonstrates the problem exceptionally well Test Test                

 protected override Size MeasureOverride(Size availableSize) { var size = new Size(); SetSide(ref size, GetSide(availableSize)); foreach (UIElement child in Children) { child.Measure(availableSize); SetOtherSide(ref size, Math.Max(GetOtherSide(size), GetOtherSide(child.DesiredSize))); } _measureSize = size; return size; } protected override Size ArrangeOverride(Size finalSize) { double offset = 0; var Side = GetSide(_measureSize) / Children.Count; var Rest = GetSide(_measureSize) % Children.Count; foreach (UIElement child in Children) { double side = Math.Floor(GetSide(_measureSize) / Children.Count); if (Rest > 0) { side++; Rest--; } var final = new Size(); SetSide(ref final, side); SetOtherSide(ref final, GetOtherSide(finalSize)); child.Arrange(new Rect(GetOffsetPoint(offset), final)); offset += side; } return finalSize; } 

如果你像这样编写StretchPanel,它会测量它的子元素的宽度和高度为零:

 public class StretchPanel : Panel { protected override Size MeasureOverride(Size availableSize) { foreach (UIElement element in Children) { element.Measure(new Size()); } return new Size(); } protected override Size ArrangeOverride(Size finalSize) { for (int i = 0; i < Children.Count; i++) { int x1 = (int)(finalSize.Width / Children.Count * i); int x2 = (int)(finalSize.Width / Children.Count * (i + 1)); Children[i].Arrange(new Rect(x1, 0, x2 - x1, finalSize.Height)); } return finalSize; } } 

然后在ItemsControl上设置HorizontalAlignment="Stretch" (或者根本不设置它,因为这是默认值)。