如何自定义绘制GridSplitter?

3
我正在从WinForms迁移到WPF,并需要自定义绘制一个网格分隔器,如下所示。这是我的WinForms实现:
在WinForms中很容易实现。我继承了Splitter类并重写了OnPaint()方法。
现在,我正在尝试找出如何继续进行。我不知道如何在XAML中使用控件模板,因为我需要在用户移动滚动条时重新绘制形状。似乎我需要编写代码,但我不知道如何继续。
我该如何继续?一个简单的例子,比如从(0,0)到(gridsplitter.right, gridsplitter.bottom)画一条线,会有所帮助。
2个回答

0
最后,我创建了一个派生自Canvas的类来执行渲染:
public class DiffSplitterCanvas : Canvas
{
    public DiffSplitterCanvas()
    {
        this.SnapsToDevicePixels = true;
    }

    protected override void OnRender(DrawingContext dc)
    {
        base.OnRender(dc);
        // draw your stuff here
    }
}

并从 XAML 代码中引用它作为控件模板:

<GridSplitter Grid.Column="1" Width="50" HorizontalAlignment="Stretch">
    <GridSplitter.Template>
         <ControlTemplate TargetType="{x:Type GridSplitter}">
            <custom:DiffSplitterCanvas/>
         </ControlTemplate>
    </GridSplitter.Template>
</GridSplitter>

-1

你可以尝试将内容绘制到一个WriteableBitmap中,并将其作为分隔符的背景。这可能需要覆盖分隔符的模板以使事情变得准确无误。但我不确定在滚动时它的性能如何。

WriteableBitmap只提供对像素的低级访问,如果您想要更高级的功能,例如绘制线条和圆形,您可能需要查找一个类似于 WriteableBitmapEx 的库,它使用GDI类似的绘图命令来扩展该类。

设置GridSplitter背景的代码:

<GridSplitter x:Name="gridSplitterTreeNodes" Width="5" BorderThickness="1,0" 
     Cursor="SizeWE" RenderTransformOrigin="-1.2,0.507" ShowsPreview="True"
     Style="{DynamicResource GridSplitterStyle1}">
  <GridSplitter.Background>
    <ImageBrush ImageSource="Images\gripDots.png" TileMode="FlipXY" 
                Stretch="UniformToFill"/>
  </GridSplitter.Background>
</GridSplitter>

你需要将 ImageBrush 设置为你的 WritableBitmap。
使用 WriteableBitmapEx 绘制一条简单线:
writeableBmp.DrawLine(1, 2, 30, 40, Colors.Green);

1
WPF的关键特性之一是允许矢量图形,因此具有可伸缩性。因此,请避免基于位图的解决方案。 - huysentruitw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接