WPF:将画布内容绘制为位图问题

时间:2011-08-26 11:54:14

标签: wpf textbox wpf-controls styles rendertargetbitmap

我有一个继承自Canvas的类DottedCanvas的自定义控件,它包含一些继承自TextBox的类TreeNode的自定义控件。画布控件具有样式:

<Style x:Key="DottedStyle" TargetType="TreeBuilder:DottedCanvas">
    <!--Makes canvas dotted-->
    <Setter Property="Background" Value="{StaticResource DottedBrush}"/>
    <Style.Triggers>
        <Trigger Property="DottedEnabled" Value="False">
            <!--Removes dots when printing-->
            <Setter Property="Background" Value="White"/>
        </Trigger>
    </Style.Triggers>
</Style>

TextBox控件包装到UserControl并且也有自己的样式:

<Style x:Key="NodeBoxStyle" TargetType="{x:Type TreeBuilder:TreeNodeBox}">
    <Setter Property="BorderThickness" Value="1"/>
    <Style.Triggers>
        <!--Must remove d-->
        <Trigger Property="IsBeingPrinted" Value="true">
            <Setter Property="BorderThickness" Value="0"/>
        </Trigger>
    </Style.Triggers>
</Style>

然后我尝试将此画布打印到位图:

public BitmapSource BuildImage(Tree tree)
{
    canvas = tree.Canvas;
    PrepareTree(canvas);

    Size size = GetSize();
    canvas.Measure(size);
    canvas.Arrange(new Rect(size));

    RenderTargetBitmap image = new RenderTargetBitmap(
        (int)size.Width,
        (int)size.Height, 
        96, 
        96, 
        PixelFormats.Pbgra32);

    image.Render(canvas);

    UnprepareTree(canvas);

    return image;
}

private void UnprepareTree(Canvas canvas)
{
    canvas.DottedEnabled = true;

    foreach (var element in canvas.Children.OfType<IPrintable>())
    {
        element.IsBeingPrinted = false;
    }
}

private void PrepareTree(Canvas canvas)
{
    canvas.Focus();
    canvas.DottedEnabled = false;

    foreach (var element in canvas.Children.OfType<IPrintable>())
    {
        element.IsBeingPrinted = true;
    }
}

图像看起来如此:

Result

Canvas没有圆点(样式确实起作用),但TextBox的BorderThickness在图像上保持1。 PrepareTree()函数中的断点显示TextBox BorderThickness属性设置为零(这意味着样式也有效)。 如何在图像上获得TextBox的“新”版本?

1 个答案:

答案 0 :(得分:1)

我成功地解决了这个问题。我在Canvas上调用了Measure()Arrange()方法,这就是它在打印之前渲染的原因。使用TextBoxes也是如此。