垂直调整StackPanel的大小以适应其内容

时间:2013-01-22 19:49:55

标签: c# windows-8 winrt-xaml windows-store-apps

我在StackPanel内有一个文本框,TextBox设置为AcceptsReturn,因此当您按Enter / Return键时,文本框的高度会变大。

我遇到的问题是我不知道如何使文本框中的StackPanel高度发生变化。因此,当文本框发生变化时,StackPanel

也应如此

我们怎么做?

    <GridView x:Name="texties" Grid.Row="1" Margin="120, 0, 0, 0" ItemsSource="{Binding Something, Mode=TwoWay}" SelectionMode="Multiple">
        <GridView.ItemTemplate>
            <DataTemplate>
                <StackPanel Margin="10" Orientation="Vertical" Width="210" >
                    <StackPanel.ChildrenTransitions>
                        <TransitionCollection>
                            <AddDeleteThemeTransition/>
                        </TransitionCollection>
                    </StackPanel.ChildrenTransitions>
                    <TextBlock Text="{Binding Name, Mode=TwoWay}" FontWeight="Bold" Style="{StaticResource ItemTextStyle}" />
                    <TextBox Text="{Binding Content, Mode=TwoWay}" FontSize="12" Background="{x:Null}" BorderBrush="{x:Null}" BorderThickness="0, 0, 0, 0" AcceptsReturn="True" IsSpellCheckEnabled="True" />
                </StackPanel>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

1 个答案:

答案 0 :(得分:1)

根据您的示例,您未设置GridView.ItemsPanelGridView.ItemsPanel的默认值为<WrapGrid />,其设置的单元格大小无法更改。您可能想要更新到<VariableSizedWrapGrid />,但此控件不能更改除渲染期间的跨度值。如果您想要的甚至可能,则需要使用<StackPanel/>作为GridView.ItemsPanel。但是,<StackPanel/>本身并不包装,因此您需要找到其他人制作的包装版本,自己制作或在单行或列中使用它。

有些开发人员会尝试根据<TextBlock />的高度更改模板的大小。这是一个好主意,但执行起来很困难。事实证明,UI元素的大小在渲染之前不会确定,因此您必须先渲染它,然后为时已晚。如果你想看看一个开发人员如何完成这个计算(考虑font-family和font-size和margin等的难度),看看here。这样的计算将允许您使用<VariableSizedWrapGrid />

在这个样本中,他正在计算一个椭圆,但它是相同的计算。

protected override Size MeasureOverride(Size availableSize)
{
    // just to make the code easier to read
    bool wrapping = this.TextWrapping == TextWrapping.Wrap;


    Size unboundSize = wrapping ? new Size(availableSize.Width, double.PositiveInfinity) : new Size(double.PositiveInfinity, availableSize.Height);
    string reducedText = this.Text;


    // set the text and measure it to see if it fits without alteration
    if (string.IsNullOrEmpty(reducedText)) reducedText = string.Empty;
    this.textBlock.Text = reducedText;
    Size textSize = base.MeasureOverride(unboundSize);


    while (wrapping ? textSize.Height > availableSize.Height : textSize.Width > availableSize.Width)
    {
        int prevLength = reducedText.Length;

        if (reducedText.Length > 0)
            reducedText = this.ReduceText(reducedText);    

        if (reducedText.Length == prevLength)
            break;

        this.textBlock.Text = reducedText + "...";
        textSize = base.MeasureOverride(unboundSize);
    }

    return base.MeasureOverride(availableSize);
}

祝你好运。