我有一个 RichTextBox
在我的应用程序中,它正在获取有关某些事件的新内容。
添加新内容时,我想滚动到底部,仅当 卷轴在底部 之前 .
我该怎么做呢?
更具体地说,给我带来麻烦的部分是确定滚动位置。
如果重要的话,RichTextBox
使用默认样式和模板,一些画笔更改或设置为 null,垂直滚动条可见性为 Auto 并且它是只读的。
最佳答案
如果您希望富文本框仅在滚动条被拖到底部时自动滚动新添加的文本,请将以下类添加到您的项目中
public class RichTextBoxThing : DependencyObject
{
public static bool GetIsAutoScroll(DependencyObject obj)
{
return (bool)obj.GetValue(IsAutoScrollProperty);
}
public static void SetIsAutoScroll(DependencyObject obj, bool value)
{
obj.SetValue(IsAutoScrollProperty, value);
}
public static readonly DependencyProperty IsAutoScrollProperty =
DependencyProperty.RegisterAttached("IsAutoScroll", typeof(bool), typeof(RichTextBoxThing), new PropertyMetadata(false, new PropertyChangedCallback((s, e) =>
{
RichTextBox richTextBox = s as RichTextBox;
if (richTextBox != null)
{
if ((bool)e.NewValue)
richTextBox.TextChanged += richTextBox_TextChanged;
else if ((bool)e.OldValue)
richTextBox.TextChanged -= richTextBox_TextChanged;
}
})));
static void richTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
RichTextBox richTextBox = sender as RichTextBox;
if ((richTextBox.VerticalOffset + richTextBox.ViewportHeight) == richTextBox.ExtentHeight || richTextBox.ExtentHeight < richTextBox.ViewportHeight)
richTextBox.ScrollToEnd();
}
}
然后在您希望自动滚动行为的任何富文本框上添加 IsAutoSroll 属性
<RichTextBox ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" local:RichTextBoxThing.IsAutoScroll="True"/>
关于WPF RichTextBox 的有条件滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13456441/