我在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.ItemsPanel
。 GridView.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/