Good-day,
I am trying to export a RadDiagram to an SVG Image, I would like to find out if it is possible to do so and how to do it.
I look forward to hearing from you.
Regards,
Tanaka
To reproduce: add a RadDiagram and use the following code snippet:
this.radDiagram1.PanToPosition(new Telerik.Windows.Diagrams.Core.Point(10,10));
Workaround: subscribe to the Pan event:
this.radDiagram1.Pan += radDiagram1_Pan;
void radDiagram1_Pan(object sender, Telerik.WinControls.UI.Diagrams.PositionChangedRoutedEventArgs e)
{
}
The loading time is very slow when there are 100 connections and the connection bridge is set to Bow
Use attached to reproduce.
Please refer to the attached gif file illustrating how to reproduce the problem.
Workaround: use the following approach for exporting to an image:
private void radButton1_Click(object sender, EventArgs e)
{
RadScrollBarElement horizontalScrollBar = this.radDiagram1.DiagramElement.Children[1] as RadScrollBarElement;
RadScrollBarElement verticalScrollBar = this.radDiagram1.DiagramElement.Children[2] as RadScrollBarElement;
this.Size = new System.Drawing.Size(this.Size.Width + (horizontalScrollBar.Maximum - this.radDiagram1.Size.Width),
this.Size.Height + (verticalScrollBar.Maximum + 1 - this.radDiagram1.Height));
Application.DoEvents();
Bitmap bmp = new Bitmap(radDiagram1.Width, radDiagram1.Height, PixelFormat.Format32bppArgb);
this.radDiagram1.DrawToBitmap(bmp, new Rectangle(0, 0, radDiagram1.Width, radDiagram1.Height));
bmp.Save(@"..\..\test2.bmp");
System.Diagnostics.Process.Start(@"..\..\test2.bmp");
}
To reproduce:
- Zoom the diagram and drop an item from the toolbox.
Workaround:
Friend Class MyToolbox
Inherits RadDiagramToolbox
Protected Overrides Sub DragDropService_PreviewDragDrop(ByVal sender As Object, ByVal e As RadDropEventArgs)
'base.DragDropService_PreviewDragDrop(sender, e);
Dim shape = TryCast(GetType(RadDiagramToolbox).GetField("shape", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance).GetValue(Me), RadDiagramShape)
Dim diagramElement As RadDiagramElement = TryCast(e.HitTarget, RadDiagramElement)
Dim containerShape As RadDiagramContainerShape = TryCast(e.HitTarget, RadDiagramContainerShape)
If containerShape IsNot Nothing Then
diagramElement = containerShape.FindAncestor(Of RadDiagramElement)()
End If
If diagramElement Is Nothing OrElse diagramElement.Shape IsNot Nothing OrElse shape Is Nothing Then
Return
End If
e.Handled = True
Dim zoom As Double = diagramElement.Zoom
Dim m As Telerik.WinControls.Layouts.RadMatrix = diagramElement.MainPanel.Transform
m.Invert()
Dim position = New Telerik.Windows.Diagrams.Core.Point(m.DX + (e.DropLocation.X - shape.Width \ 2) * 1 / zoom, m.DY + (e.DropLocation.Y - shape.Height \ 2) * 1 / zoom)
If containerShape IsNot Nothing Then
position.X += containerShape.Position.X
position.Y += containerShape.Position.Y
End If
shape.Position = position
diagramElement.AddShape(shape, Nothing, True)
If containerShape IsNot Nothing Then
DirectCast(containerShape, IContainerShape).AddItem(shape)
End If
shape = Nothing
End Sub
End Class
To reproduce: run the attached sample project and follow the steps in the gif file. When you start dragging, (i.e. when MouseMove first fires) there is a large jump to the position of the image.
To reproduce: create a RadDiagram with several shapes. Try to zoom and pan with the gesture. Sometimes the shapes jumps.
Workaround:
Private Sub RadDiagram1_MouseDoubleClick(sender As Object, e As MouseEventArgs)
If e.Clicks = 2 Then
Dim shape As RadDiagramShape = Me.RadDiagram1.DiagramElement.ElementTree.GetElementAtPoint(e.Location).FindAncestor(Of RadDiagramShape)()
If shape IsNot Nothing Then
'ToDo
End If
End If
End Sub
To reproduce:
public Form1()
{
InitializeComponent();
RadDiagramShape shape = new RadDiagramShape();
shape.Text = "Shape1";
shape.AllowCopy = false;
shape.AllowPaste = false;
shape.AllowDelete = false;
shape.AllowCut = false;
shape.Position = new Telerik.Windows.Diagrams.Core.Point(50, 50);
shape.BackColor = Color.Red;
this.radDiagram1.AddShape(shape);
}
Workaround: Hide the first tab in the SettinsgPane as it is demonstrated in the following article: http://www.telerik.com/help/winforms/diagram-settings-pane.html
To reproduce:
- Add some shapes and zoom so only one is visible.
- Export to image.
- The image size is not correct.
Workaround:
private const int InflateValue = 7;
public System.Drawing.Image ExportToImage()
{
RadDiagramElement diagram = radDiagram1.DiagramElement;
var enclosingBounds = diagram.CalculateEnclosingBounds();
using (Bitmap image = new Bitmap((int)(Math.Abs(enclosingBounds.Right) + InflateValue + Math.Abs( enclosingBounds.Left)), (int)(Math.Abs(enclosingBounds.Bottom) + InflateValue + Math.Abs(enclosingBounds.Top))))
{
System.Drawing.Graphics nativeGraphics = System.Drawing.Graphics.FromImage(image);
nativeGraphics.FillRectangle(new System.Drawing.SolidBrush(diagram.ElementTree.RootElement.BackColor), 0, 0, image.Width, image.Height);
Telerik.WinControls.Paint.RadGdiGraphics radGdi = new Telerik.WinControls.Paint.RadGdiGraphics(nativeGraphics);
foreach (RadElement element in diagram.ItemsHost.GetChildren(ChildrenListOptions.ZOrdered))
{
element.Paint(radGdi, new System.Drawing.Rectangle(int.MinValue / 2, int.MinValue / 2, int.MaxValue, int.MaxValue), 0f, new System.Drawing.SizeF(1, 1), true);
}
System.Drawing.Image img = (System.Drawing.Image)image.Clone();
nativeGraphics.Dispose();
radGdi.Dispose();
return img;
}
}
To reproduce:
- Add some connections and zoom.
- Click a connection
- The event is not fired.
Workaround:
Friend Class MyInputBehaviour
Inherits DiagramInputBehavior
Public Sub New(ByVal element As RadDiagramElement)
MyBase.New(element)
End Sub
Public Overrides Function HandleMouseUp(ByVal e As MouseEventArgs) As Boolean
' return base.HandleMouseUp(e);
If Me.DiagramElement.ElementTree.Control.Site IsNot Nothing Then
Return False
End If
Dim elementUnderMouse As RadElement = Me.DiagramElement.ElementTree.GetElementAtPoint(e.Location)
If Me.IsScrollBar(elementUnderMouse) Then
Return False
End If
If TypeOf elementUnderMouse Is RadButtonElement Then
Return False
End If
Dim position = e.Location
Dim transform As Telerik.WinControls.Layouts.RadMatrix = Me.DiagramElement.MainPanel.TotalTransform
transform.Invert()
Dim transformedPosition = transform.TransformPoint(position)
Dim service = Me.DiagramElement.Controller.ServiceLocator.GetService(Of IHitTestService)()
Dim conectionUnderPoint = TryCast(service.GetItemsNearPoint(transformedPosition, DiagramConstants.SelectionHitTestRadius).Where(Function(i) TypeOf i Is IConnection).OrderByDescending(Function(x) x.ZIndex).FirstOrDefault(), IConnection)
If conectionUnderPoint IsNot Nothing Then
DirectCast(Me.DiagramElement, IGraphInternal).PublishDiagramEvent(DiagramEvent.ConnectionClicked, New GenericEventArgs(Of IConnection)(conectionUnderPoint, e))
End If
Dim mi = Me.DiagramElement.GetType().GetMethod("UpdateFocusedElement", System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic)
mi.Invoke(Me.DiagramElement, Nothing)
Return False
End Function
End Class
Change like this:
RadDiagram1.DiagramElement.InputBehavior = New MyInputBehaviour(RadDiagram1.DiagramElement)
To reproduce:
- Add some shapes and call the BringToView method
Private Sub RadButton4_Click(sender As Object, e As EventArgs) Handles RadButton4.Click
Dim ds As RadDiagramShape
For i As Integer = 0 To Me.RadDiagram1.Shapes.Count - 1
If i = 2 Then
ds = DirectCast(RadDiagram1.Shapes(i), RadDiagramShape)
Me.RadDiagram1.DiagramElement.BringIntoView(ds, 1.0, True)
Exit For
End If
Next
End Sub
Workaround:
Me.RadDiagram1.DiagramElement.BringIntoView(ds, 1.0, False)
The user is not allowed to add a shape or edit an existing one by using the TextTool: http://docs.telerik.com/devtools/winforms/diagram/diagram-tools/text-tool Workaround: Me.RadDiagramRibbonBar1.buttonTextTool.Visibility = Telerik.WinControls.ElementVisibility.Collapsed
To reproduce: - Add shape and zoom the view. - Call the method: radDiagram1.DiagramElement.BringIntoView(radDiagram1.Shapes[0]); Workaround: radDiagram1.DiagramElement.BringIntoView(radDiagram1.Shapes[0],radDiagram1.Zoom, false);