ScintillaNet странное изменение размеров в приложении WPF

Я хочу использовать несколько небольших элементов управления ScintillaNet в моем приложении WPF. Я скомпилировал ветку WPF из репозитория ScintillaNet. Я добавил элемент управления Scrintilla:

<UserControl x:Class="LogicEditor.View.ScriptInput"
         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:scintilla="http://scintillanet.codeplex.com"
         mc:Ignorable="d" 
         d:DesignHeight="63" d:DesignWidth="195">
    <Grid>
        <scintilla:ScintillaWPF HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="_scintilla" />
    </Grid>
</UserControl>

Управление выглядит хорошо. Если я увеличиваю элемент управления, элемент управления сцинтиллы также увеличивается, но если я уменьшаю его, элемент управления сцинтиллы сохраняет размер и перекрывает другой пользовательский интерфейс.

Я посмотрел на пример приложения ScintillaNet.WPF: SCide.WPF. В этом приложении все работает нормально, но я не вижу никакой разницы в моем коде.

Я думаю, что изменение размера и перекрытие - это две разные проблемы. Я также попробовал обычный WindowsFormsHost без оболочки WPF, но там у меня та же проблема.

Кто-нибудь может помочь?

Редактировать: это происходит только тогда, когда элемент управления Scintilla находится в списке

2 ответа

Я знаю, что эта проблема очень старая, но я хотел оставить здесь решение на случай, если кто-то еще столкнулся с этим. Кажется, что ScintillaNET не любит размещаться внутри элемента управления WPF ScrollViewer.

У меня случайно был элемент управления WindowsFormHost, представленный ContentPresented, который был внутри (как вы уже догадались) ScrollViewer. Даже отключение / скрытие вертикальной полосы прокрутки с помощью ScrollViwer с ScrollBarVisibility не сработало. Казалось бы, это также не связано с виртуализацией, поскольку она должна быть включена. Поскольку Scintilla реализует собственную прокрутку, решение состоит в том, чтобы избежать размещения ScintillaNET в любой форме ScrollViewer и просто позволить ему обрабатывать прокручиваемый контент.

Ваша проблема в том, что у List есть ScrollViewer. Получите это оттуда, и это должно исправить это.

Я знаю, что эта проблема очень старая, но у меня была та же проблема, и я решил ее с помощью пользовательской панели, которая минимизирует желаемый размер текстового редактора:

public class ScintillaPanel : Panel
{
    protected override Size MeasureOverride(Size availableSize)
    {
        var children = InternalChildren.OfType<UIElement>();
        var firstChild = children.FirstOrDefault();
        if (firstChild != null)
            firstChild.Measure(new Size(0, 0));
        return new Size(0, 0);
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        var children = InternalChildren.OfType<UIElement>();
        var firstChild = children.FirstOrDefault();
        if (firstChild != null)
            firstChild.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
        return finalSize;
    }
}

А затем оберните контроль сцинтиллы следующим образом:

<local:ScintillaPanel>
    <WindowsFormsHost>
        <scintilla:Scintilla/>
    </WindowsFormsHost>
</local:ScintillaPanel>
Другие вопросы по тегам