我已经创建了一个用户控件,它使用avalonedit控件。用户控件的XAML是:
<UserControl x:Class="CodeNote.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:avalonedit="http://icsharpcode.net/sharpdevelop/avalonedit"
xmlns:editing="clr-namespace:ICSharpCode.AvalonEdit.Editing">
<UserControl.Resources>
<ControlTemplate x:Key="TextBoxBaseControlTemplate1" TargetType="{x:Type TextBoxBase}">
<Border Background="{TemplateBinding Background}"
x:Name="Bd" BorderBrush="#D1D1E8"
BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="10, 10, 0, 0">
<ScrollViewer x:Name="PART_ContentHost"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" TargetName="Bd"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
<Trigger Property="Width" Value="Auto">
<Setter Property="MinWidth" Value="100"/>
</Trigger>
<Trigger Property="Height" Value="Auto">
<Setter Property="MinHeight" Value="20"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</UserControl.Resources>
<Grid>
<StackPanel Margin="0,0,0,10">
<TextBox x:Name="txtTitle" VerticalContentAlignment="Center" Template="{StaticResource TextBoxBaseControlTemplate1}" FontWeight="Bold" Margin="5,5,5,0" Padding="5, 3, 5, 2" FontFamily="Arial" FontSize="12" BorderThickness="1,1,1,0" Background="#FFF0F0F0"></TextBox>
<Border BorderThickness="1" CornerRadius="0,0,10,10" BorderBrush="#D1D1E8" Background="#FFF7F7F9" Margin="5,0,5,0" Padding="5,5,5,5">
<avalonEdit:TextEditor
xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit"
Name="textEditor"
FontFamily="Courier New"
SyntaxHighlighting="Java"
Background="#FFF7F7F9"
ShowLineNumbers="True"
VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility ="Hidden"
WordWrap="True"
FontSize="12pt"/>
</Border>
</StackPanel>
</Grid>
</UserControl>主窗口在网格中的StackPanel中包含以下ScrollViewer
<Window x:Class="CodeNote.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:avalonedit="http://icsharpcode.net/sharpdevelop/avalonedit"
xmlns:editing="clr-namespace:ICSharpCode.AvalonEdit.Editing"
x:Name="mainWin"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ScrollViewer VerticalScrollBarVisibility="Visible" CanContentScroll="False">
<StackPanel Grid.Row="0" Margin="10,10,10,0" VerticalAlignment="Top" x:Name="container">
</StackPanel>
</ScrollViewer>
</Grid>
</Window>用户应该能够以编程方式将用户控件添加到主窗口,这是在后面的主窗口代码中完成的:
UserControl1 avEditor = new UserControl1(); container.Children.Add(avEditor);
我的问题是,当avalonedit控件的内容垂直于窗口变得太大时,滚动查看器不会滚动到底部。插入点从可见窗口底部消失,滚动位置停留在顶部。
我注意到,如果我添加一个常规文本框而不是avalonedit控件,滚动就能正常工作。
我如何纠正这个问题(我对WPF非常陌生)
请注意,该程序需要能够向此滚动查看器添加多个文本输入控件,例如雪崩,后面跟着一个文本框,然后是另一个文本框,然后是另一个雪崩。因此,我不能只使用滚动查看器的ScrollToBottom方法,因为正在编辑的控件可能不是滚动查看器中的最后一个控件。
我只需要插入点保持屏幕和窗口滚动相应。
发布于 2015-01-09 19:39:31
看起来Caret.BringCaretToView()只滚动AvalonEdit本身,它不会将BringIntoView请求发送到可视树上。
我认为您需要修改AvalonEdit源代码来解决这个问题。
发布于 2021-09-17 22:03:45
我不是专家,但下面是我所使用的伪尾巴使用AvalonEdit。_scroll只是一个复选框,用户可以取消选中以停止滚动。
private void PullAndLoadData()
{
Task.Delay(1000);
TailFile = TailFile + _logStream.Read();
Dispatcher.Invoke(() => { textEditor.Text = TailFile; });
if (_scroll) Dispatcher.Invoke(() => { textEditor.ScrollToEnd(); });
}https://stackoverflow.com/questions/27672643
复制相似问题