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プロパティがゼロに設定されていることを示します(つまり、スタイルも機能します)。画像に「新しい」バージョンのTextBoxを追加するにはどうすればよいですか?

4

1 に答える 1

1

私は問題を解決することに成功します。Canvas でMeasure()andメソッドを呼び出したので、印刷前にレンダリングされました。Arrange()TextBoxes で同じことをするのが助けになりました。

于 2011-08-30T20:04:37.040 に答える