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