我在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>

最佳答案

根据您的样本,您未设置GridView.ItemsPanelGridView.ItemsPanel的默认值是<WrapGrid />,它具有无法更改的设置单元格大小。您可能会想更新到<VariableSizedWrapGrid />,但此控件只能在渲染期间更改跨度值。如果您想要的甚至是可能的,则将要求您使用<StackPanel/>作为GridView.ItemsPanel。但是,<StackPanel/>本身不是自动换行的,因此您将需要查找其他人制作的换行版本,自己创建换行版本,或者将其放在单个行或列中。

一些开发人员尝试根据其<TextBlock />的高度更改模板的大小。这是一个好主意,但执行起来却很困难。事实证明,UI元素的大小直到渲染后才确定,因此您必须先渲染它,然后为时已晚。如果要查看一个开发人员是如何完成此计算的(请考虑字体家族的难度以及字体大小和边距等),请查看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);
}


祝你好运。

关于c# - 垂直调整StackPanel的大小以适合其内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14466826/

10-13 06:01