【问题标题】:How to disable auto scroll on Scrollviewer for child controls如何在 Scrollviewer 上为子控件禁用自动滚动
【发布时间】:2019-07-09 14:25:57
【问题描述】:

我有以下相当简单的代码

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

我想禁用以下行为:

  • 滚动条可见
  • 点击第一个文本框中的文本
  • 单击第二个文本框中的填充区域

=>滚动查看器将移动滚动条,使文本框左边框与可见窗口边框对齐

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

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

【问题讨论】:

  • 滚动行为由FrameworkElement.RequestBringIntoViewEvent触发。它是一个路由事件,在调用FrameworkElement.BringIntoView 时引发(由焦点处理程序FrameworkElement.OnGotFocus 调用)。父 ScrollViewer 订阅此事件并通过将子元素居中来处理它,该子元素是相对于视口的事件源。
  • 如果只需要显示文字,最好使用TextBlock。它对性能的影响较小,并且不会触发 ScrollViewer 的滚动到视图行为。
  • @BionicCode 我也需要能够编辑文本

标签: c# wpf scrollviewer


【解决方案1】:

是的,这是可能的。您只需要处理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;
}

【讨论】:

  • 谢谢,这正是我想要的
【解决方案2】:

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

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

【讨论】:

  • 用户交互的默认滚动行为应该仍然有效。因此,当用户与滚动条交互时,它应该正常滚动内容。
猜你喜欢
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多