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

WPF:将画布内容绘制到位图问题,wpf,textbox,wpf-controls,styles,rendertargetbitmap,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 Dot

我有一个从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=tree.canvas;
准备人(帆布);
Size=GetSize();
画布。测量(尺寸);
canvas.Arrange(新矩形(大小));
RenderTargetBitmap图像=新建RenderTargetBitmap(
(int)size.Width,
(int)大小、高度,
96, 
96, 
像素格式(Pbgra32);
图像渲染(画布);
无准备树(画布);
返回图像;
}
私有void unparetree(画布)
{
canvas.dotteEnabled=true;
foreach(canvas.Children.OfType()中的var元素)
{
element.IsBeingPrinted=false;
}
}
私有void PrepareTree(画布)
{
canvas.Focus();
canvas.dotteEnabled=false;
foreach(canvas.Children.OfType()中的var元素)
{
element.IsBeingPrinted=true;
}
}
图像看起来是这样的:

画布没有点(样式完成了它的工作),但文本框的边框厚度在图像上保持为1。
PrepareTree()
函数中的断点显示TextBox BorderThickness属性设置为零(这意味着该样式也可以工作)。
如何在图像上获取文本框的“新”版本

我成功地解决了这个问题。我在画布上调用了
Measure()
Arrange()
方法,这就是为什么它在打印之前呈现。使用文本框进行同样的操作很有帮助。

我成功地解决了这个问题。我在画布上调用了
Measure()
Arrange()
方法,这就是为什么它在打印之前呈现。使用文本框进行同样的操作很有帮助。

谢谢,这也帮了我的忙!我正在将画布元素绘制到BitmapRenderTarget,但没有在应用程序中显示它们,这解决了我遇到的一个问题(位图显示为空白)。谢谢,这也帮了我的忙!我将画布元素绘制到BitmapRenderTarget,而不在应用程序中显示它们,这解决了我遇到的一个问题(位图显示为空白)。