我正在从WinForms迁移到WPF,我需要自定义绘制网格探测器,如下所示。这是我的WinForms实现:
在WinForms中,它很容易实现。我继承了Splitter类,只是覆盖了OnPaint()
方法。
现在,我正在试图弄清楚如何继续。我不知道如何在XAML中使用控件模板,因为我需要在用户移动滚动时重新绘制形状。似乎我需要编写代码,但我不知道如何继续。
我该怎么办?一个简单的例子,例如从(0,0)
到(gridsplitter.right, gridsplitter.bottom)
画一条线会有所帮助。
答案 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);