如何防止外部滚动查看器覆盖内部滚动查看器?

How to prevent outer scrollviewer from overriding inner scrollviewer?

我的网格中有以下部分:

<ScrollViewer   Grid.Column="4" Grid.Row="0" CanContentScroll="True"  HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
    <StackPanel Orientation="Vertical" Margin="10" HorizontalAlignment="Stretch">

        <!-- other controls such as sliders, Textboxes and so on -->

        <Border Height="200" BorderThickness="1" BorderBrush="DarkGray" Margin="5" HorizontalAlignment="Stretch">
            <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="auto" >
                <TextBlock Text="{Binding LogOutput}" Style="{StaticResource BodyTextBlockStyle}" TextWrapping="NoWrap"/>
            </ScrollViewer>
        </Border>
    </StackPanel>
</ScrollViewer>

如果我在 LogOuput 中添加一个很长的文本(使用“Ipsum Lorem”测试),出于某种原因我的边框宽度会增加并且外部 ScrollViewer 显示水平滚动条.

我想要的是,边框的宽度不会改变(始终拉伸到此网格列的可用 space)并且内部 ScrollViewer 应该显示水平滚动条。 我知道我可以通过为边框设置固定宽度来实现这一点,但是 - 如前所述 - 我希望边框延伸到可用 space.

我怎样才能做到这一点?

您可以将内部 ScrallViewerWidth 绑定到列的宽度:

<Border Height="200" BorderThickness="1" BorderBrush="DarkGray" Margin="5" HorizontalAlignment="Stretch"
        Width="{Binding Path=ColumnDefinitions[putColIndexHere], Converter={StaticResource ColDefinitionToWidthConverter}, ConverterParameter=30, RelativeSource={RelativeSource AncestorType=Grid}}">
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="auto" Background="Cyan"
                    >
        <TextBlock Text="{Binding StrTest}" TextWrapping="NoWrap"/>
    </ScrollViewer>
</Border>

Convert方法可以看起来像:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{   
    if(value is System.Windows.Controls.ColumnDefinition colDef)
    {
        return colDef.ActualWidth + colDef.Offset - int.Parse(parameter as string) ;
    }
    return value;
}