Как отключить автоматическую прокрутку на Scrollviewer для дочерних элементов управления - PullRequest
0 голосов
/ 09 июля 2019

У меня есть следующий довольно простой код

  <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>

Я хочу отключить следующее поведение:

  • полоса прокрутки видна
  • нажмите на текств первом текстовом поле
  • щелкните область заполнения во втором текстовом поле

=> средство просмотра прокрутки переместит полосу прокрутки так, чтобы левая граница текстового поля была выровнена с видимой границей окна

Я бы хотел отключить эту функцию автоматической прокрутки.Возможно ли это?

Поведение прокрутки по умолчанию при взаимодействии с пользователем все еще должно работать.Поэтому, когда пользователь взаимодействует с полосой прокрутки, он должен прокручивать содержимое в обычном режиме.

First textbox click After click in padding area

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Да, это возможно.Вам просто нужно обработать событие RequestBringIntoView для ScrollViewer, всплывающего до второго StackPanel.Просто отметьте его как обработанный.

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;
}
0 голосов
/ 09 июля 2019

Если я правильно понимаю ваше описание проблемы, вы можете использовать:

<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>
...