RichTextBox WPF 的滚动条

问题描述

我创建了一个具有固定宽度和高度(A4 纸的大小)的 RichTextBox。当数据超出高度时,我想垂直滚动文本。通过将 VerticalScrollBarVisibility 属性设置为 Hidden,我可以通过鼠标滚轮实现垂直滚动。在此之前一切正常。

如果我将 VerticalScrollBarVisibility 属性更改为“Visible”,它会显示附加到 RichTextBox 的垂直滚动条。因为,我使用 RichtextBox 的固定宽度,滚动条不会出现在窗口的右侧。但是,我希望在我的窗口右侧有一个单独的滚动条(就像每个浏览器一样)。我在窗口中添加一个单独的垂直滚动条。现在的问题是,如何将 Scrollbar 事件链接到 RichTextBox 滚动?

     <Style x:Key="RichTxtStyle"  targettype="{x:Type RichTextBox}">
        <Setter Property="VerticalScrollBarVisibility" Value="Hidden"/>
        <Setter Property="HorizontalScrollBarVisibility" Value="disabled"/>
        <Setter Property="AcceptsReturn"  Value="True"/>            
        <Setter Property="Margin" Value="40,40,0"/>
        <Setter Property="Padding" Value="50,50,50"/>
        <Setter Property="Width" Value="827"/>
        <Setter Property="MinHeight"  Value="1169"/>
        <Setter Property="BorderThickness" Value="0"/>           
    </Style>

这里是滚动条对象

 <ScrollBar x:Name="VerticalScroll"   Grid.Row="1" Grid.Column="1" Orientation="Vertical" ValueChanged="VerticalScroll_ValueChanged"/>

下面是事件,我试过了。这就是我完全迷失的地方?。

        private void VerticalScroll_ValueChanged(object sender,RoutedPropertyChangedEventArgs<double> e)
    {
        double offset = e.NewValue;
        RichTxtBx.ScrollToVerticalOffset(offset);
    }

解决方法

如果我错了,请纠正我,但@meysam asadi 的方法是让您用 RichTextBox 包裹 ScrollViewer。有时这是不希望的,因为性能下降。相反,您应该简单地使用:

<Window x:Class="stackvoerflow_65766040.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:stackvoerflow_65766040"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <RichTextBox VerticalScrollBarVisibility="Visible" x:Name="rtbMain">
            
        </RichTextBox>
    </Grid>
</Window>

然后就可以使用“rtbMain”的ScrollToEnd()ScrollToVerticalOffset(double offset)等方法了。

要捕捉 ScollChanged 事件,您可以像这样使用 ScrollViewer.ScrollChanged="rtbMain_ScrollChanged"

<Window x:Class="stackvoerflow_65766040.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:stackvoerflow_65766040"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <RichTextBox VerticalScrollBarVisibility="Visible" x:Name="rtbMain"
                     ScrollViewer.ScrollChanged="rtbMain_ScrollChanged">
        </RichTextBox>
    </Grid>
</Window>

代码隐藏:

using System.Windows;
using System.Windows.Controls;

namespace stackvoerflow_65766040
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void rtbMain_ScrollChanged(object sender,ScrollChangedEventArgs e)
        {

        }
    }
}

如果您还想在代码隐藏中从 ScrollViewer 分配 RichTextBox 的事件,您应该简要看一下:WPF accessing scrollviewer of a listview codebehind

,

我认为这段代码很有用。

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
   <RichTextBox Style="{StaticResource RichTxtStyle}">
               
   </RichTextBox>
</ScrollViewer>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...