[英]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
...,所以也許添加一個帶有RenderTargetBitmap
的Image
,該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.