WPF ScrollViewer - “Page Up / Down”键一直到开头/结尾?

时间:2013-05-07 01:57:56

标签: c# wpf textbox scroll scrollviewer

在XAML中,我设置了一个包含ScrollViewer的Grid,其中包含一个TextBox:

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_OnLoaded">
    <Grid>
        <ScrollViewer>
            <TextBox Name="TempTextBox" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto"></TextBox>
        </ScrollViewer>
    </Grid>
</Window>

然后我(在C#中以编程方式)在该文本框中添加了一堆文本。很多台词。大多数情况下,垂直滚动按照我的预期工作:我可以单击并拖动滚动条抓取;我可以点击抓取器上方或下方的滚动条;我可以使用向上和向下箭头键;我可以使用Ctrl-Home和Ctrl-End。所有这一切都很好。但是:

如果我使用Page Up或Page Down键,就好像我使用了Ctrl-Home或Ctrl-End。也就是说,它会转到文本的顶部或底部,而不是向上或向下翻页。

我做错了吗?我很确定这不是像“你的Ctrl键被卡住”这样的问题,因为Page Up和Page Down在我的电脑上的其他应用程序中运行良好。

2 个答案:

答案 0 :(得分:5)

删除ScrollViewer。

TextBox具有开箱即用的滚动支持,它不需要这个上瘾控件'ScrollViewer'来滚动。在TextBox中设置ScrollViewer.VerticalScrollBarVisibility =“Auto”,但不要用ScrollViewer包装TextBox,你就可以了。

您正在提供两种相互冲突的滚动可能性。

我有一个带有ScrollViewer.VerticalScrollBarVisibility =“Auto”的TextBox,没有ScrollViewer,Page Up和Page Down工作正常。

为了测试,我在'TextBox'周围添加了'ScrollViewer',然后它开始显示你所说的相同问题。

答案 1 :(得分:1)

在我的情况下,我正在使用RichTextBox,我无法使用RichTextBox的原始滚动条,因为我有另一个函数来缩放RichTextBox的缩放比例ScaleTransform

如果我使用RichTextBox的原始滚动条,滚动条的大小也会放大,我想避免它,所以我放弃使用RichTextBox的原始滚动条, 然后转而使用ScrollViewer的ScrollBar,它不会调整大小。

而且,我解决Page Up/Down keys goes all the way to the start/end Problem的方式,

是在RichTextBox的PreviewKeyDown事件中写 PageUp / PageDown Action:

richTextBox.PreviewKeyDown += (sender2, e2) =>
{
    if (e2.Key == Key.PageUp)
    {
        richTextBox.Focus();
        //Use Code to Scroll Up 6 Lines  
        for (int j = 0; j < 6; j++)  
            EditingCommands.MoveUpByLine.Execute(null, richTextBox);
        e2.Handled = true;
    }
    if (e2.Key == Key.PageDown)
    {
        richTextBox.Focus();
        //Use Code to Scroll Down 6 Lines
        for (int j = 0; j < 6; j++)    
            EditingCommands.MoveDownByLine.Execute(null, richTextBox);
        e2.Handled = true;
    }
};

我受到了帖子的启发:

WPF Datagrid page up and page down event handling manually