如何防止外部滚动查看器覆盖内部滚动查看器?
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.
我怎样才能做到这一点?
您可以将内部 ScrallViewer
的 Width
绑定到列的宽度:
<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;
}
我的网格中有以下部分:
<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.
我怎样才能做到这一点?
您可以将内部 ScrallViewer
的 Width
绑定到列的宽度:
<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;
}