【问题标题】:Scrollbar for RichTextBox WPFRichTextBox WPF 的滚动条
【发布时间】:2021-01-17 21:16:27
【问题描述】:

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

如果我将 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,0,40,0"/>
        <Setter Property="Padding" Value="50,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);
    }

【问题讨论】:

    标签: c# wpf scrollbar wpf-controls


    【解决方案1】:

    如果我错了,请纠正我,但@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)
            {
    
            }
        }
    }
    
    

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

    【讨论】:

    • 感谢您的帮助。这里的问题如前所述,ScrollViewer 出现在richtextbox 的右侧边缘。 RichTextBox 位于窗口的中间。窗口的边缘位于屏幕的边缘。我不希望 ScrollBar 出现在richtextbox 的边缘,而是出现在窗口的边缘,而不要将richtextbox 扩展到窗口的边缘。
    【解决方案2】:

    我认为这段代码很有用。

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

    【讨论】:

    • 感谢您的回复。这种方法的问题是 RichTextBox 失去了它的高度属性。我不知道为什么。另外,我不希望滚动条位于 Richtextbox 的边缘,而是位于窗口的边缘,而不要将 RichTextBox 扩展到窗口的边缘。
    猜你喜欢
    • 2011-10-18
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多