1
votes

I've created a user control which uses the avalonedit control. The XAML for the user control is:

<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>

The main window contains the following StackPanel within a ScrollViewer within a Grid

<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>

The user should be able to programmatically add the usercontrol to the main window, which is accomplished in the main window code behind with:

UserControl1 avEditor = new UserControl1(); container.Children.Add(avEditor);

My problem is that the scrollviewer does not scroll to the bottom when the avalonedit control's contents becomes too vertically large for the window. The insertion point simply disappears off the bottom of the visible window and the scroll position stays at the top.

I notice that the scroll works correctly if I add a regular textbox instead of a avalonedit control.

How can I rectify this (I am very new to WPF)

Please note that the program needs to be able to add multiple text input controls to this scroll viewer, e.g avalonedit followed by a text box followed by another textbox followed by another avalonedit. Therefore, I can't just use the scrollviewer's ScrollToBottom method because the control being edited might not be the last control in the scrollviewer.

I simply need the insertion point to remain onscreen and the window to scroll accordingly.

2

2 Answers

0
votes

Seems like Caret.BringCaretToView() only scrolls AvalonEdit itself, it doesn't send BringIntoView request up the visual tree.

I think you'd need to change the AvalonEdit source code to fix this.

0
votes

I am no expert but below is what I use for a pseudo tail using AvalonEdit. The _scroll is just a checkbox the user can uncheck to stop scrolling.

private void PullAndLoadData()

    {
        Task.Delay(1000);
        TailFile = TailFile + _logStream.Read();
        Dispatcher.Invoke(() => { textEditor.Text = TailFile; });
    
        if (_scroll) Dispatcher.Invoke(() => { textEditor.ScrollToEnd(); });
    }

Hope this help.