我有一个继承自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的“新”版本?
答案 0 :(得分:1)
我成功地解决了这个问题。我在Canvas上调用了Measure()
和Arrange()
方法,这就是它在打印之前渲染的原因。使用TextBoxes也是如此。