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>