如何自定义绘制GridSplitter

时间:2015-05-06 16:03:26

标签: c# .net wpf

我正在从WinForms迁移到WPF,我需要自定义绘制网格探测器,如下所示。这是我的WinForms实现:

enter image description here

在WinForms中,它很容易实现。我继承了Splitter类,只是覆盖了OnPaint()方法。

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

我该怎么办?一个简单的例子,例如从(0,0)(gridsplitter.right, gridsplitter.bottom)画一条线会有所帮助。

2 个答案:

答案 0 :(得分: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 :(得分:-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绘制simpleLine:

writeableBmp.DrawLine(1, 2, 30, 40, Colors.Green);