1

我想在我的 WPF 应用程序中使用一些小的 ScintillaNet 控件。我已经从 ScintillaNet 存储库编译了 WPF 分支。我添加了 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>

控件看起来不错。如果我增加控制,闪烁控件也会增加,但如果我减少控件,闪烁控件会保持大小并与其他 UI 重叠。

我查看了 ScintillaNet.WPF 的示例应用程序:SCide.WPF。在这个应用程序中一切正常,但我看不到我的代码有任何相关差异。

我认为调整大小和重叠是两个不同的问题。我也尝试了没有 WPF 包装器的普通 WindowsFormsHost,但我遇到了同样的问题。

有人可以帮忙吗?

编辑: 仅当 Scintilla 控件位于列表中时才会发生这种情况

4

2 回答 2

1

我知道这个问题已经很老了,但我想在这里留下一个解决方案,以防其他人遇到这个问题。似乎 ScintillaNET 不喜欢托管在 WPF ScrollViewer 控件中。

我无意中让我的 WindowsFormHost 控件由位于(您猜对了)ScrollViewer 内部的 ContentPresented 呈现。即使使用带有 ScrollBarVisibility 的 ScrollViwer 禁用/隐藏垂直滚动条也不起作用。它似乎也与虚拟化无关,因为必须启用它。由于 Scintilla 实现了自己的滚动,因此解决方案是避免将 ScintillaNET 托管在任何形式的 ScrollViewer 中,而让它本机处理其滚动内容。

您的问题是 List 有一个 ScrollViewer。把它弄出来,它应该修复它。

于 2013-10-17T19:13:01.577 回答
1

我知道这个问题已经很老了,但我遇到了同样的问题,并通过一个自定义面板解决了这个问题,该面板最小化了文本编辑器所需的大小:

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>
于 2017-02-23T14:20:18.637 回答