【问题标题】:How to strech items in itemcontrol如何在项目控制中拉伸项目
【发布时间】:2014-05-06 10:04:01
【问题描述】:

所以我试图让 itemscontrol 中的一些项目水平拉伸,当您查看以下代码时,您可能会注意到我非常绝望。我简化了我的代码并添加了一些颜色,以便更好地查看哪些控件在哪里开始和结束......有没有可能告诉项目同样拉伸并填充整个水平空间?

<Grid Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
<ItemsControl x:Name="HorizontalListBox" Background="Blue"
    HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
    <ItemsControl.Items>
        <System:Int32>4</System:Int32>
        <System:Int32>4</System:Int32>
        <System:Int32>4</System:Int32>
        <System:Int32>4</System:Int32>
        <System:Int32>4</System:Int32>
    </ItemsControl.Items>
    <ItemsControl.Template>
        <ControlTemplate>
            <ItemsPresenter HorizontalAlignment="Stretch"/>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid Background="Green"
                VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                <TextBlock Text="Test" HorizontalAlignment="Stretch"/>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>

看起来像这样:this http://image-upload.de/image/0TgZx9/0dd27b5326.png

然而,我希望有可能让绿色物品遍布整个地方。

编辑:感谢在下面的答案中找到的博文,它进行了一些调整:

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;
  foreach (UIElement child in Children)
  {
    double side = GetSide(_measureSize) / Children.Count;
    var final = new Size();
    SetSide(ref final, side);
    SetOtherSide(ref final, GetOtherSide(finalSize));
    child.Arrange(new Rect(GetOffsetPoint(offset), final));
    offset += side;
  }
  return finalSize;
}

【问题讨论】:

标签: silverlight xaml itemscontrol


【解决方案1】:

听起来您需要StretchPanel。 Silverlight 没有这样的面板,但您可以自己编写。 我通过 google StretchPanel blog 找到了一个,只是快速浏览了一下代码,我觉得还可以。

<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <StretchPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

【讨论】:

  • 几乎是我所需要的,我对 MeasureOverride 和 ArrangeOverride 方法做了一些调整,所以一切都得到了拉伸。感谢您向我提示该博客条目。将方法添加到主帖中。
  • 请注意,如果放在 StackPanel 中,我调整的方法将导致运行时错误,因为如果放在 StackPanel 中,availableSize 将为 Height=Infinity, Width=Infinity。
【解决方案2】:

我认为是您对StackPanel 的使用导致缺乏弹性。如果您将面板模板替换为其他类型的控件,它将服从HorizontalAlignment="Stretch" 请求。

【讨论】:

    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2022-01-12
    • 2018-12-15
    • 2019-06-20
    • 2016-02-26
    相关资源
    最近更新 更多