我在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>
答案 0 :(得分:1)
根据您的示例,您未设置GridView.ItemsPanel
。 GridView.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);
}
祝你好运。