C# 如何自定义绘制网格拆分器

C# 如何自定义绘制网格拆分器,c#,.net,wpf,C#,.net,Wpf,我正在从WinForms迁移到WPF,我需要定制一个gridsplitter,如下所示。这是我的WinForms实现: 在WinForms中很容易实现。我继承了Splitter类,只重写了OnPaint()方法 现在,我正在想办法继续。我不知道如何在XAML中使用控件模板,因为我需要在用户移动滚动时重新绘制形状。似乎我需要在后面编写代码,但我不知道如何继续 我该怎么做?一个简单的示例,例如从(0,0)到(gridsplitter.right,gridsplitter.bottom)绘制一条线,

我正在从WinForms迁移到WPF,我需要定制一个gridsplitter,如下所示。这是我的WinForms实现:

在WinForms中很容易实现。我继承了Splitter类,只重写了
OnPaint()
方法

现在,我正在想办法继续。我不知道如何在XAML中使用控件模板,因为我需要在用户移动滚动时重新绘制形状。似乎我需要在后面编写代码,但我不知道如何继续


我该怎么做?一个简单的示例,例如从
(0,0)
(gridsplitter.right,gridsplitter.bottom)
绘制一条线,将有所帮助。

您可以尝试绘制
可写位图
,并将其用作拆分器的背景。这可能涉及覆盖拆分器的模板以使事情完全正确。我不确定滚动会有多大的效果

WriteableBitmap只提供对像素的低级访问,如果您想要更高级的函数,如绘制直线和圆,您可能需要查看一个库,该库使用类似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>

最后,我创建了一个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>

WPF的关键功能之一是它允许矢量图形,因此具有可扩展性。因此,避免使用基于位图的解决方案。
<GridSplitter Grid.Column="1" Width="50" HorizontalAlignment="Stretch">
    <GridSplitter.Template>
         <ControlTemplate TargetType="{x:Type GridSplitter}">
            <custom:DiffSplitterCanvas/>
         </ControlTemplate>
    </GridSplitter.Template>
</GridSplitter>