c# - 如何在 XAML 中定义的 Canvas 子 UIElement 上方的 Canvas 上显示绘图视觉

标签 c# wpf xaml canvas

因此,我在从 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...因此可能会添加带有 RenderTargetBitmapImage,其中又可以包含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/

相关文章:

c# - 单选按钮组 XAML

wpf - 触发时间延迟

c# - 如何解析json值长字符

c# - 如何解决 VS Code 中的 "The type or namespace name ' System' could not be found” 错误?

C# 解析无名称的Json文件

c# - 进行隧道事件的正确方法

c# - 在 wpf listview DataTemplate 中更改图像源

c# - 目录搜索器可以查询操作属性吗?

wpf - 动态隐藏菜单项

c# - DataGrid 文本框 DataTrigger 条件未按预期工作