簡體   English   中英

如何自定義繪制GridSplitter

[英]How to custom-paint a GridSplitter

我正在從WinForms遷移到WPF,我需要自定義繪制網格分析器,如下所示。 這是我的WinForms實現:

在此輸入圖像描述

在WinForms中,它很容易實現。 我繼承了Splitter類,只是重寫了OnPaint()方法。

現在,我正在試圖弄清楚如何繼續。 我不知道如何在XAML中使用控件模板,因為我需要在用戶移動滾動時重新繪制形狀。 似乎我需要編寫代碼,但我不知道如何繼續。

我該怎么辦? 一個簡單的例子,比如從(0,0)(gridsplitter.right, gridsplitter.bottom)繪制一條線會有所幫助。

最后,我創建了一個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>

您可以嘗試繪制到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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM