如何在 Scrollviewer 上禁用子控件的自动滚动

How to disable auto scroll on Scrollviewer for child controls

我有以下相当简单的代码

  <Window ... Width=400 Height=400>
    <ScrollViewer HorizontalScrollBarVisibility="Auto"  >
        <StackPanel VerticalAlignment="Top"
                    HorizontalAlignment="Left">
            <TextBox TextWrapping="Wrap"
                     Margin="0,5,0,5"
                     Width="500"
                     Padding="20">Scrolling is enabled when it is necessary. 
                Resize the window, making it larger and smaller.</TextBox>
            <StackPanel Orientation="Horizontal">
                <Label Content="aswkognweklng"></Label>
                <TextBox TextWrapping="Wrap"
                         Margin="0,5,0,5"
                         Width="500"
                         Padding="20">Scrolling is enabled when it is necessary. 
                Resize the window, making it larger and smaller.</TextBox>
            </StackPanel>
        </StackPanel>
    </ScrollViewer>
  </Window>

我想禁用以下行为:

=> 滚动查看器将移动滚动条,以便文本框左边框与可见 window 边框对齐

我想禁用此自动滚动行为。这可能吗?

用户交互的默认滚动行为应该仍然有效。因此,当用户与滚动条交互时,它应该正常滚动内容。

如果我理解你对问题的描述,你可以使用:

<ScrollViewer HorizontalScrollBarVisibility="Hidden"  >...

或者 Grid 更符合您的要求:

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
  <TextBox 
    Grid.Column="0"
    Grid.ColumnSpan="2"
    TextWrapping="Wrap"
    AcceptsReturn="True"
    VerticalScrollBarVisibility="Auto"
    Height="100"
    Margin="0,5,0,5"
    Padding="20">Scrolling is enabled when it is necessary. 
            Resize the window, making it larger and smaller.</TextBox>
    <Label 
      Content="aswkognweklng"
      Grid.Column="0"
      Grid.Row="1">         
    </Label>
    <TextBox 
      TextWrapping="Wrap"
      AcceptsReturn="True"
      Height="100"
      VerticalScrollBarVisibility="Auto"
      Margin="0,5,0,5"
      Grid.Column="1"
      Grid.Row="1"
      Padding="20">Scrolling is enabled when it is necessary. 
            Resize the window, making it larger and smaller.</TextBox>
</Grid>

是的,这是可能的。您只需要处理 ScrollViewer 冒泡到第二个 StackPanel 的 RequestBringIntoView 事件。只需将其标记为已处理。

XAML:

<ScrollViewer HorizontalScrollBarVisibility="Auto"  >
    <StackPanel VerticalAlignment="Top"
                HorizontalAlignment="Left">
        <TextBox TextWrapping="Wrap"
                 Margin="0,5,0,5"
                 Width="500"
                 Padding="20">Scrolling is enabled when it is necessary. 
            Resize the window, making it larger and smaller.</TextBox>
        <StackPanel Orientation="Horizontal" RequestBringIntoView="StackPanel_RequestBringIntoView">
            <Label Content="aswkognweklng"></Label>
            <TextBox TextWrapping="Wrap"
                     Margin="0,5,0,5"
                     Width="500"
                     Padding="20">Scrolling is enabled when it is necessary. 
            Resize the window, making it larger and smaller.</TextBox>
        </StackPanel>
    </StackPanel>
</ScrollViewer>

C#:

private void StackPanel_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
  e.Handled = true;
}