簡體   English   中英

如何在XAML中定義的Canvas的子UIElement上方的畫布上顯示drawingvisual

[英]how to display drawingvisual on canvas above child UIElements of Canvas defined in XAML

因此,我在來自畫布的類中的VisualCollection視覺對象中有一個drawingvisual標記。

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中定義畫布的所有子項並將它們添加到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中的set marker事件上運行了此代碼。

    {
    MarkerVisual = new DrawingVisual();
    using (DrawingContext dc = MarkerVisual.RenderOpen())
    {
      dc.DrawLine(MarkerPen, new Point(MouseHorizontalPositionInPixels, YPositionForStartOfVerticalAxisLines),
        new Point(MouseHorizontalPositionInPixels, ActualHeight));
    }
    this.AddVisualChild(MarkerVisual);

但是,在這種情況下,將顯示畫布中以xaml定義的UIelements,而不顯示標記drawingvisual。

將Visual轉換為UIElement將允許Panel.Children.Add ...,所以也許添加一個帶有RenderTargetBitmapImage ,該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);
};

最終,我決定WPF不想讓我的畫布同時包含uielements和它自己的視覺集合。 可以將添加到Children中的Elements並將其放置在Loaded Event上您自己的可視集合中。 但是,我從“兒童”中刪除的用於處理自己的物品似乎並不會隨着更改而自動更新,因此很可能並非易事。 擁有一個用於所有繪圖視覺效果的容器元素,並使用grid.zindex像這樣放置它要容易得多:

             <Grid
                Grid.ZIndex="3"
                Grid.Row="0"
                Grid.RowSpan="2"
                Grid.Column="0"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch"
                x:Name="dragSelectionGrid"
                Visibility ="Visible"
                >
                <Components:MarkerElement 
                  Grid.ZIndex="1"
                  VerticalAlignment="stretch"
                  HorizontalAlignment="stretch"
                  />
                <Canvas x:Name="dragSelectionCanvas"
                        Grid.ZIndex="2"
                        >
                  <Border 
                    x:Name="dragSelectionBorder"
                    BorderBrush="White"
                    BorderThickness="0"
                    CornerRadius="1"
                    Visibility="Collapsed"
                    />
                </Canvas>
              </Grid>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM