1

我有一个从 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;
    }
}

图像看起来是这样的:

结果

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

4

1 回答 1

1

I succeed to solve the problem. I called Measure() and Arrange() methods on Canvas, that's why it rendered before printing. Making the same with TextBoxes helped.

于 2011-08-30T20:04:37.040 回答