问题描述
我创建了一个具有固定宽度和高度(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>