RadDiagramShape has NULL content but has DataContext and ContentTemplate. In the ContentTemplate there are UIElements defined. Their automation peers are not added in the automation tree. This can be observed in UIVerify tools.
The exception is thrown for the RotationAngle property.
The issue can be observed also in the opposite direction - the diagram is serialized on a machine with some culture (for example Portugal Porguese - pt-PT) and then restored on a machine with an English culture.
The issue reproduces only when saving and loading between cultures which numeric separators are different. For example, with Bulgarian culture, the number 4.5 is represented as 4,5 (with a comma). With English culture the number will be represented as 4.5 (with a period).
To work this around, create a custom RadDiagramShape and override its Deserialize() method. Then parse the RotationAngle manually, and set it to the RotationAngle property of the shape. After this, set the RotationAngle of the SerializationInfo to null, in order to prevent the default restoring of the property.
public
partial
class
CustomShape : RadDiagramShape, IEquatable<BaseShape>
{
public
override
void
Deserialize(SerializationInfo info)
{
if
(info[
"RotationAngle"
] !=
null
)
{
var angle = Convert.ToDouble(info[
"RotationAngle"
].ToString(), CultureInfo.InvariantCulture);
this
.RotationAngle = angle;
info[
"RotationAngle"
] =
null
;
}
base
.Deserialize(info);
}
}
While performing Cut operation inside RadDiagram, an exception in the MS Clipboard occurs with the following message:
System.Runtime.InteropServices.COMException: 'OpenClipboard Failed (Exception from HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN))'
The exception throws when you use RadDiagram in a data binding scenario by populating its GraphSource and you want to draw a shape using the RadDiagramRibbon's ShapeTool.
InvalidOperationException: 'Cannot modify the Items collection when the GraphSource is set.'
To work this around, use the PreviewMouseDown, PreviewMouseMove and PreviewMouseUp events of RadDiagram in order to prevent the default logic executed by the ShapeTool. Then, in the event handlers, implement a custom logic that works with the diagram GraphSource.
private void RadDiagramRibbon_Loaded(object sender, RoutedEventArgs e)
{
var toolService = diagram.ServiceLocator.GetService<IToolService>() as ToolService;
this.shapeTool = (ShapeTool)toolService.ToolList.FirstOrDefault(x => x is ShapeTool);
}
private Point startPoint;
private bool isShapeCreationInProgress;
private MyNode currentShapeModel; // where MyNode derives from NodeViewModelBase and expose an additional Geometry property
private ShapeTool shapeTool;
private void RadDiagram_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (this.shapeTool.IsActive && !this.isShapeCreationInProgress)
{
this.isShapeCreationInProgress = true;
this.startPoint = this.diagram.GetTransformedPoint(e.GetPosition(this.diagram));
this.currentShapeModel = new MyNode()
{
Geometry = this.shapeTool.Geometry,
Position = this.startPoint,
Width = 0,
Height = 0
};
var source = (MyGraphSource)this.diagram.GraphSource;
source.AddNode(this.currentShapeModel);
e.Handled = true;
}
}
private void RadDiagram_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (this.shapeTool.IsActive && this.currentShapeModel != null && this.isShapeCreationInProgress)
{
var transformedPoint = this.diagram.GetTransformedPoint(e.GetPosition(this.diagram));
var width = Math.Abs(this.startPoint.X - transformedPoint.X);
var height = Math.Abs(this.startPoint.Y - transformedPoint.Y);
var x = Math.Min(this.startPoint.X, transformedPoint.X);
var y = Math.Min(this.startPoint.Y, transformedPoint.Y);
this.currentShapeModel.Width = width;
this.currentShapeModel.Height = height;
this.currentShapeModel.Position = new Point(x, y);
e.Handled = true;
}
}
private void RadDiagram_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
this.isShapeCreationInProgress = false;
e.Handled = true;
}
In a NetCore project, when dragging the diagram from the toolbox into the designer, an exception is thrown inside the designer.
With Visual Studio 2019 Preview v. 16.10.0. Preview 2.0, Net 5 project => when dragging from the ToolBox - the VS goes into a non-responsive state (Vs is busy is shown or the VS crashed and closed automatically).
Hundreds of Connections with ConnectionsBridges turned on in diagram. One on top of the others.
StackOverflowException between updating the Connections' Start/End points.
NullReferenceException is thrown when trying to save RadDiagram instance that contains a RadDiagramShape with its Geometry assigned to a GeometryGroup value.
To work this around, you can flatten the GeometryGroup before setting the shape's Geometry property. This is done by calling the GetFlattenedPathGeometry() method of the GeometryGroup.
shape.Geometry = group.GetFlattenedPathGeometry();
Hi,
In project we have noticed that sometimes for RadDiagram.ConnectionManipulationCompleted we receive unexpected values in event.
This problem is not systematic but it occurs often at the drag of new connection.
To make it reproducible for you I used CustomConnectors sample project from Diagram.
For easier analysis I recorded a video with bug and changes to CustomConnectors project.
Best regards,
Bartosz