2013-12-19 91 views
1

因此,我在VisualCollection中的可視化標記來自畫布派生的類。如何在兒童畫布上顯示畫布在XAML中定義的畫布的UIElements

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中嗎?如果我只是重寫這兩個方法,那麼當渲染調用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中定義的UI元素,但不顯示標記。

+1

也許這將助陣 - http://msdn.microsoft.com/en-us/庫/ ms742254(v = vs.110)的.aspx – terrybozzio

回答

0

最終我決定,WPF不希望我的畫布包含uielements和它自己的視覺集合。可以將已添加到Children的元素放入您自己的加載事件視覺集合中。然而,我從兒童處理自己的項目似乎並沒有自動更新,所以很可能不是微不足道的事情。這是容易得多,只是對所有繪製視覺效果的容器元素和公正的地方,使用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> 
2

將Visual轉換爲UIElement將允許Panel.Children.Add ...因此可以將ImageRenderTargetBitmap相加,其可以包含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); 
};