Wpf ScrollViewer:将文本输入区域自动滚动到可见窗口的边缘

问题描述

我遇到了一个问题,没有运气去解决它。我有一个可容纳ItemsControl的ScrollViewer。在ItemsControl内部,每个项目都有一个带有文本列的DataGrid,以便用户可以输入相关信息。

XAML如下所示:

<Grid Grid.Row="1" Grid.Column="1" Margin="2.5,0">
            <ScrollViewer x:Name="SetPointTableScroll" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
                <ItemsControl ItemsSource="{Binding ChannelList}" Grid.Column="1">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid Margin="0,2,0">
                                <DataGrid VerticalAlignment="Top" Style="{StaticResource DataGridStyle}" HeadersVisibility="None" Grid.Column="0" 
                                          SelectedIndex="{Binding DataContext.SelectedIndex,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" 
                                          ItemsSource="{Binding StepList}" CanUserSortColumns="False" Margin="0,1,0"
                                          IsEnabled="{Binding DataContext.SequenceNotInProgress,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
                                          CanUserDeleteRows="False" CanUserAddRows="False">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Binding="{Binding SetPoint}" IsReadOnly="False" Width="202"/>
                                        <DataGridTextColumn Binding="{Binding RampRate}" IsReadOnly="False" Width="202"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </ScrollViewer>
        </Grid>

以下是用户界面中网格图片的链接:

DataGrid in UI

我遇到的问题是,当启用水平滚动并且用户尝试编辑DataGrid中的单元格时,ScrollViewer会尝试滚动,以使正在编辑的文本位于窗口的最右边。这非常令人迷惑,并且编辑相邻列中的单元格变得更加耗时。在下图中可以看到:

Text Editor at Right Edge of Window

我的理想行为是仅禁用滚动查看器中的任何自动滚动,这样在其中单击或编辑任何内容时,它都不会尝试滚动。

我查看了我的问题,发现了许多处理类似问题的帖子(即Stop WPF ScrollViewer automatically scrolling to perceived contentWPF DataGrid: how do I stop auto scrolling when a cell is clicked?)。解决方案似乎是处理ScrollViewer或产生该事件的元素的RequestBringIntoView事件。我试图实现此解决方案没有成功。下面是我创建的事件处理程序:

private void SetPointTableScroll_RequestBringIntoView(object sender,RequestBringIntoViewEventArgs e)
    {
        Console.WriteLine("Handled!");
        e.Handled = true;
    }

当我将ScrollViewer的RequestBringIntoView事件(SetPointTableScroll)绑定到此事件处理程序时,行为没有变化。当我从ItemsControl,StackPanel或DataGrid绑定同一事件时,无论正在编辑哪个单元格,ScrollViewer都会一直滚动到最左边。

任何帮助将不胜感激!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...