我正在尝试将TextBox控件放在一个相当大的面板中(使用GridSplitter)。
我遇到的第一个问题是TextBox会自动调整大小,因为所包含的文本变得冗长。我在这个站点找到了一个解决方案,用Text包装TextBox,然后将TextBox的宽度设置为Border的宽度(如下面的XAML所示)。这似乎有效。我提到这个问题是因为问题的原因我正在寻求帮助。
当前的问题是TextBox调整大小,但ScrollViewer在调整面板大小时立即启动。我希望看到的是当TextBox的大小减小到最小宽度(而不是之前)时ScrollViewer启动。
我目前使用的完整XAML如下所示。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="NonExpandingTextBoxDemo.MainWindow" Height="350" Title="MainWindow" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ScrollViewer Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" HorizontalScrollBarVisibility="Auto" VerticalAlignment="Stretch" VerticalScrollBarVisibility="Auto">
<Border HorizontalAlignment="Stretch" Margin="20, 20, 20, 20" MinWidth="100" VerticalAlignment="Center">
<TextBox Width="{Binding Mode=OneWay, Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Border}, Mode=FindAncestor}}" />
</Border>
</ScrollViewer>
<GridSplitter Grid.Column="1" Grid.Row="0" ResizeBehavior="PreviousAndNext" VerticalAlignment="Stretch" Width="3" />
<TextBlock Grid.Column="2" Grid.Row="0" HorizontalAlignment="Center" Text="Right Panel" VerticalAlignment="Center" />
</Grid>
</Window>
问题是我错过了什么?我尝试了几件事,但似乎没什么用。
提前感谢您对此问题的任何指导。
答案 0 :(得分:0)
问题是ScrollViewer。请参阅,ScrollViewer未配置为在其子项变小时调整其大小,仅更大。因此,您会看到子元素增长但不会缩小。
为什么需要ScrollViewer?
<Window x:Class="TextWrappingAtParentSize.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Name="FirstCol" MinWidth="100" Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border VerticalAlignment="Center" Margin="20, 20, 20, 20" >
<TextBox Width="{Binding Mode=OneWay, Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Border}, Mode=FindAncestor}}" TextWrapping="Wrap"/>
</Border>
<GridSplitter Grid.Column="1" Grid.Row="0" ResizeBehavior="PreviousAndCurrent" VerticalAlignment="Stretch" Width="3" />
<TextBlock Grid.Column="2" Grid.Row="0" HorizontalAlignment="Center" Text="Right Panel" VerticalAlignment="Center" />
</Grid>
</Window>
通过在列上放置MinWidth,可能永远不需要滚动。但是,我意识到这可能只是一个示例,您可能还有其他需要滚动。
我可以继续寻找滚动解决方案。让我知道。
答案 1 :(得分:0)
我的情景类似。我有一个包含网格的scrollviewer,我需要TexBlock随列扩展并包装文本。我能够通过创建转换器来实现这一目标。
public class ValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int width;
if (int.TryParse(value.ToString(), out width) && width > 0)
{
return width - int.Parse(parameter.ToString());
}
return 0;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
包含ScrollViewer的名称是“scrollViewerDetails”,因此我将其宽度传递给转换器。 ConverterParamter(170)是我需要从总宽度中减去的第一列的宽度。
<TextBox Grid.Column="1" Grid.Row="4" HorizontalAlignment="Stretch" Width="{Binding ElementName=scrollViewerDetails, Path=ActualWidth, Converter={StaticResource ValueConverter}, ConverterParameter=170}" />