gpt4 book ai didi

WPF:ScrollViewer 和 Grid - 禁用 TexBox 调整大小

转载 作者:行者123 更新时间:2023-12-02 00:57:54 25 4
gpt4 key购买 nike

考虑以下 XAML 示例。

  1. 我有一个 ScrollViewer。如果窗口对于网格来说太小,滚动条将可见。
  2. 在 ScrollViewer 中是网格。网格中的所有项目都应拉伸(stretch)到网格的列宽。
  3. 现在有文本框(文本很长)。

我的问题是,如果文本越来越大,文本框会越来越大。但我只想让文本框适合网格空间。

如何禁用文本框调整大小,里面有大文本?

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="26" />
<RowDefinition Height="26" />
<RowDefinition Height="26" />
<RowDefinition Height="26" />
<RowDefinition Height="26" />
<RowDefinition Height="26" />
<RowDefinition Height="10*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" MinWidth="130" />
<ColumnDefinition Width="130" />
</Grid.ColumnDefinitions>

<Label VerticalAlignment="Center" HorizontalAlignment="Left" Content="Label 1" Grid.Column="0" Grid.Row="0"/>
<TextBox x:Name="Tbox1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="asfas fasd fasdf asdf asdf asdf asdf asf safasdf asdf asdf fasasd fas f" TextWrapping="Wrap" Height="22" Grid.Column="1" Grid.Row="0" />

<Label VerticalAlignment="Center" HorizontalAlignment="Left" Content="Label 2" Grid.Column="0" Grid.Row="1"/>
<TextBox x:Name="Tbox2" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="asfas fasd fasdf asdf asdf asdf asdf asf safasdf asdf asdf fasasd fas f" TextWrapping="Wrap" Height="22" Grid.Column="1" Grid.Row="1" />

</Grid>
</ScrollViewer>

最佳答案

您需要确保 TextBox 不会调整 Grid 的大小。

最简单的方法是将文本框放在这样的容器中,忽略其子项的大小,例如 Canvas 。您还需要通过将文本框绑定(bind)到列宽来设置文本框大小。

<ScrollViewer HorizontalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition x:Name="MiddleColumn" Width="*" MinWidth="130" />
<ColumnDefinition Width="130" />
</Grid.ColumnDefinitions>

<Canvas Grid.Column="1">
<TextBox Width="{Binding ActualWidth, ElementName=MiddleColumn}"/>
</Canvas>

</Grid>
</ScrollViewer>

但是,请注意, Canvas 还会占用 TextBox 的高度,并且如果文本被换行,则不会调整该行的大小。您可以通过将 Canvas 高度 DataBinding 到 TextBox.ActualHeight 来解决此问题。您可以将此布局绑定(bind)封装为可重用的样式:

<ContentControl Grid.Column="1" Style="{StaticResource IgnoreContentWidthStyle}">
<TextBox Text="asfasdf asdfad sfa sdf" TextWrapping="Wrap"/>
</ContentControl>

<Style x:Key="IgnoreContentWidthStyle" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Canvas Height="{Binding ActualHeight, ElementName=PART_Content}">
<ContentPresenter x:Name="PART_Content"
Content="{TemplateBinding Content}"
Width="{TemplateBinding ActualWidth}"/>
</Canvas>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

或者,您可以创建派生自 Panel 或 Decorator 的自定义元素,这将覆盖 MeasureOverride 和 ArrangeChildren 并将文本框放入其中。这种方法可以为您提供更好的性能,因为您避免了布局绑定(bind)。

关于WPF:ScrollViewer 和 Grid - 禁用 TexBox 调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32438324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com