0

我正在尝试将 TextBox 控件放置在一个相当大的面板中(使用 GridSplitter)。

我遇到的第一个问题是,当输入的文本变长时,TextBox 会自动调整大小。我在这个站点上找到了一个解决方案,它用边框包装 TextBox,然后将 TextBox 的宽度设置为边框的宽度(如下面的 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>

问题是我错过了什么?我尝试了几件事,但似乎没有任何效果。

预先感谢您对此问题的任何指导。

4

2 回答 2

0

我的情况类似。我有一个滚动查看器包裹一个网格,我需要 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}" />
于 2014-06-10T13:31:57.903 回答
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 放在列上,可能永远不需要滚动。但是,我意识到这可能只是一个示例,您可能还有其他需要滚动。

我可以继续寻找滚动解决方案。让我知道。

于 2012-11-02T17:38:21.660 回答