Is it possible to display a WPF UIElement as a graphic overlay onto an Arcgis basemap?
It sounds like it might represent a form of symbol to style a graphic in a graphics overlay?
You could use RenderTagetBitmap to render an image and apply that via a PictureMarkerSymbol.
Here's some code that creates a UniqueValueRenderer from a series of UIElements rendered using RenderTargetBitmap:
private async Task CreatePictureMarkerSymbols() { _strobeCanvas = new Canvas(); Ellipse ellipse = new Ellipse() { Height = 40, Width = 40, IsHitTestVisible = false, RenderTransform = new ScaleTransform(), Fill = new RadialGradientBrush() { GradientStops = new GradientStopCollection(5) { new GradientStop(Color.FromArgb(0,255, 0, 0),0), new GradientStop(Color.FromArgb(255,255, 0, 0),0.25), new GradientStop(Color.FromArgb(0,255, 0, 0),0.5), new GradientStop(Color.FromArgb(255,255, 0, 0),0.75), new GradientStop(Color.FromArgb(0,255, 0, 0),1), } } }; _strobeCanvas.Children.Add(ellipse); for (int i = 1; i <= _numberOfPictureMarkerSymbols; i++) { // Scale up the Ellipse double increment = Convert.ToDouble(i) / 5; Transform scaleTransform = new ScaleTransform(increment, increment); double scaleTransformOrigin = 0; ellipse.Opacity -= _opacityStep; ellipse.RenderTransform = scaleTransform; ellipse.RenderTransformOrigin = new Point(scaleTransformOrigin, scaleTransformOrigin); _strobeCanvas.RenderTransform = scaleTransform; _strobeCanvas.RenderTransformOrigin = new Point(scaleTransformOrigin, scaleTransformOrigin); _strobeCanvas.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); _strobeCanvas.Arrange(new Rect(ellipse.DesiredSize)); Rect bounds = VisualTreeHelper.GetContentBounds(ellipse); bounds.Transform(ellipse.RenderTransform.Value); var dpiXProperty = typeof(SystemParameters).GetProperty("DpiX", BindingFlags.NonPublic | BindingFlags.Static); var dpiX = (int)dpiXProperty.GetValue(null, null); double dpi = Convert.ToDouble(dpiX); // Create a new RenderTargetBitmap to render the ellipse RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap( (Int32)(bounds.Width * dpi / 96.0), (Int32)(bounds.Height * dpi / 96.0), dpi, dpi, PixelFormats.Pbgra32); // Setup the drawing context DrawingVisual drawingVisual = new DrawingVisual(); using (DrawingContext drawingContext = drawingVisual.RenderOpen()) { VisualBrush visualBrush = new VisualBrush(ellipse); drawingContext.DrawRectangle(visualBrush, pen: null, rectangle: new Rect(new Point(), bounds.Size)); } // Render the visual element renderTargetBitmap.Render(drawingVisual); // Use a PngBitmapEncoder to retrieve the image PngBitmapEncoder pngBitmapEncoder = new PngBitmapEncoder(); pngBitmapEncoder.Frames.Add(BitmapFrame.Create(source: renderTargetBitmap)); using (var stream = new MemoryStream()) { pngBitmapEncoder.Save(stream); stream.Seek(0, SeekOrigin.Begin); // Create a new PictureMarkerSymbol and set the Source PictureMarkerSymbol pms = await PictureMarkerSymbol.CreateAsync(stream); // Create a new UniqueValueInfo class for this image instance UniqueValue strobeUniqueValueInfo = new UniqueValue() { Symbol = pms, }; // Add the UniqueValueInfo to the UniqueValueRenderer strobeUniqueValueInfo.Values.Add(i); _strobeUniqueValueRenderer.UniqueValues.Add(strobeUniqueValueInfo); } } // Set the UniqueValueRenderer field _strobeUniqueValueRenderer.FieldNames.Add(_strobeField); }
Alternatively, if it's one or more symbols defined in XAML and you are looking for a longer term solution and vectorized rendering then you could look into converting the XAML to SVG and importing the SVG into ArcGIS Pro as a symbol layer for a mobile style which you can use in ArcGIS Runtime.
Resources:
Přihlášení členové mohou přispívat, sledovat aktualizace a další. Jste tu noví? Zaregistrujte si bezplatný účet.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.