因此,我在从 Canvas 派生的类中的 VisualCollection 视觉效果中有一个绘图视觉标记。
public class OverlayCanvas:Canvas
{
VisualCollection visuals;
DrawingVisual MarkerVisual = new DrawingVisual();
}
在 xaml 中,我定义了一个拖动选择边框,我也希望绘制它。
Components:OverlayCanvas
>
<Border
x:Name="dragSelectionBorder"
BorderBrush="White"
BorderThickness="0"
CornerRadius="1"
Visibility="Collapsed"
/>
</Components:OverlayCanvas>
如何让两者都显示?
通常我会覆盖这些,但是我是否必须在 xaml 中定义 Canvas 的所有子项并将它们添加到 VisualCollection 中?如果我只是重写这两个方法,那么当 render 调用 getvisualchild 时,它只会绘制标记 DrawingVisual,但不会获取 xaml 中定义的项目。
protected override Visual GetVisualChild(int index)
{
return visuals[index];
}
protected override int VisualChildrenCount
{
get
{
return visuals.Count;
}
}
我想也许我可以Panel.Children.Add,但它需要一个UIElement。然后我认为也许正确的做法是 Visual.AddVisualChild,因此我在 Canvas 中的设置标记事件上运行了此代码。
{
MarkerVisual = new DrawingVisual();
using (DrawingContext dc = MarkerVisual.RenderOpen())
{
dc.DrawLine(MarkerPen, new Point(MouseHorizontalPositionInPixels, YPositionForStartOfVerticalAxisLines),
new Point(MouseHorizontalPositionInPixels, ActualHeight));
}
this.AddVisualChild(MarkerVisual);
但是,在这种情况下, Canvas 中 xaml 中定义的 UIelement 会显示,但不会显示标记 DrawingVisual。
最佳答案
将视觉对象转换为 UIElement 将允许使用 Panel.Children.Add
...因此可能会添加带有 RenderTargetBitmap
的 Image
,其中又可以包含DrawingVisual。所以类似:
DrawingVisual MarkerVisual = new DrawingVisual();
Loaded += (sender, args) => {
DrawingContext drawingContext = MarkerVisual.RenderOpen();
drawingContext.DrawText(text, new Point(2, 2));
drawingContext.Close();
RenderTargetBitmap bmp = new RenderTargetBitmap(180, 180, 120, 96, PixelFormats.Pbgra32);
bmp.Render(drawingVisual);
Image image = new Image();
image.Source = bmp;
this.Children.Add(image);
};
关于c# - 如何在 XAML 中定义的 Canvas 子 UIElement 上方的 Canvas 上显示绘图视觉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20693385/