.cs code:
public
partial class MainPage
{
public MainPage()
{
InitializeComponent();
showDiagram();
}
private void showDiagram()
{
var model = new GraphLinksModel<MyNodeData, String, String, MyLinkData>();
model.Modifiable =
true;
List<Point> points = new List<Point>();
MyNodeData node = new MyNodeData();
node.Key =
"0";
node.Location =
new Point(0, 0);
node.Category =
"TransparentNode";
MyNodeData node1 = new MyNodeData();
node1.Key =
"1";
node1.Location =
new Point(50, 50);
node1.Category =
"IconicNode";
node1.YAxisLabel =
"Stopping Point";
node1.ToolTipText =
"Key: 1";
node1.ToolTipText +=
"\nType: IconicNode";
node1.ToolTipText +=
"\nImage: Yes";
points.Add(node1.Location);
MyNodeData node2 = new MyNodeData();
node2.Key =
"2";
node2.Location =
new Point(200, 50);
node2.Category =
"IconicNode";
node2.YAxisLabel =
"Stopping Point";
points.Add(node2.Location);
model.NodesSource =
new ObservableCollection<MyNodeData>();
model.AddNode(node);
model.AddNode(node1);
model.AddNode(node2);
model.LinksSource =
new ObservableCollection<MyLinkData>();
MyLinkData link = new MyLinkData();
link.From =
"1";
link.To =
"2";
link.Category =
"ArrowLinkTemplate";
//model.AddLink(node1, null, node2, null);
model.AddLink(link);
model.Modifiable =
false;
xDiagram.Model = model;
model =
new GraphLinksModel<MyNodeData, String, String, MyLinkData>();
model.Modifiable =
true;
model.NodesSource =
new ObservableCollection<MyNodeData>();
node =
new MyNodeData();
node.Key =
"0";
node.Location =
new Point(0, 0);
node.Category =
"TransparentNode";
model.AddNode(node);
node =
new MyNodeData();
node.Key =
"1";
node.Text =
"Stopping Point";
node.Location =
new Point(0, 50);
model.AddNode(node);
yDiagram.Model = model;
yDiagram.AllowScroll =
false;
yDiagram.AllowDragOut =
false;
yDiagram.SelectionDeleting +=
new EventHandler<DiagramEventArgs>(yDiagram_SelectionDeleting);
}
void yDiagram_SelectionDeleting(object sender, DiagramEventArgs e)
{
deleteYDiagramNode();
}
private void OnDeleteContextMenuItemClick(object sender, RoutedEventArgs e)
{
var partdata = ((FrameworkElement)sender).DataContext as PartManager.PartBinding;
if (partdata == null || partdata.Data == null)
{
MessageBox.Show("Clicked on nothing or on unbound part");
}
else
{
yDiagram.SelectedParts.Add(partdata.Part);
deleteYDiagramNode();
}
}
private void deleteYDiagramNode()
{
if (yDiagram.SelectedParts != null)
{
var selectedNodes = new Part[yDiagram.SelectedParts.Count];
yDiagram.SelectedParts.CopyTo(selectedNodes, 0);
foreach (Part p in selectedNodes)
{
var n = p as Node;
if (n == null)
continue;
// ignore Links
var data = n.Data as MyNodeData;
if (data == null)
continue;
/*var myNodeDatas = xDiagram.NodesSource as IEnumerable;
if (myNodeDatas != null)
{
foreach (var otherdata in myNodeDatas)
{
if (otherdata.YAxisLabel == data.Text)
{
xDiagram.Model.Modifiable = true;
xDiagram.Model.RemoveNode(otherdata);
xDiagram.Model.Modifiable = false;
}
}
}*/
yDiagram.Model.RemoveNode(data);
}
}
}
private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Node node = Part.FindAncestor<Node>(sender as UIElement);
if (node != null && node.Data != null)
{
if (DiagramPanel.IsDoubleClick(e))
{
//do job on double click
e.Handled =
true;
MessageBox.Show("Double clicked on " + node.Data);
}
//do job on single click
MyLinkData link = new MyLinkData();
List<Point> points = new List<Point>();
points.Add(
new Point(node.Location.X, node.Location.Y + 10));
points.Add(
new Point(node.Location.X + 100, node.Location.Y + 10));
link.Points = points;
link.Category =
"ArrowLinkTemplate";
((
GraphLinksModel<MyNodeData, String, String, MyLinkData>) xDiagram.Model).Modifiable = true;
((
GraphLinksModel<MyNodeData, String, String, MyLinkData>)xDiagram.Model).AddLink(link);
((
GraphLinksModel<MyNodeData, String, String, MyLinkData>)xDiagram.Model).Modifiable = false;
}
}
}
public class MyNodeData : GraphLinksModelNodeData<String>
{
public BitmapImage NodeImage
{
get
{
var image = new BitmapImage(new Uri("/AssgnAudio.JPG", UriKind.Relative));
return image;
}
set{}
}
public string ToolTipText { get; set; }
public string YAxisLabel { get; set; }
}
public class MyLinkData : GraphLinksModelLinkData<String, String>
{
}
// this DraggingTool is used by yDiagram, but modifies the node data in xDiagram.Model
public class CustomDraggingTool : DraggingTool
{
public Diagram OtherDiagram
{
get { return this.Tag as Diagram; }
}
// limit movement to be vertical only
protected override Point ComputeMove(Node n, Point newloc, Dictionary<Part, DraggingTool.Info> draggedparts)
{
newloc.X = n.Location.X;
if (newloc.Y > Diagram.ActualHeight - 50)
newloc.Y = Diagram.ActualHeight - 50;
else if (newloc.Y < 0)
newloc.Y = 0;
return newloc;
}
public override void DoActivate()
{
base.DoActivate();
if (this.OtherDiagram != null)
this.OtherDiagram.StartTransaction("Diagram1 moves");
}
public override void DoDeactivate()
{
base.DoDeactivate();
if (this.OtherDiagram != null)
this.OtherDiagram.CommitTransaction("Diagram1 moves");
}
protected override void DragOver(Point pt, bool moving, bool copying)
{
base.DragOver(pt, moving, copying);
if (this.OtherDiagram == null)
return;
foreach (Part p in DraggedParts.Keys)
{
var n = p as Node;
if (n == null)
continue;
// ignore Links
var data = n.Data as MyNodeData;
if (data == null)
continue; // not data bound?
var myNodeDatas = OtherDiagram.NodesSource as IEnumerable<MyNodeData>;
if (myNodeDatas != null)
{
foreach (var otherdata in myNodeDatas)
{
if (otherdata.YAxisLabel == data.Text)
{
// move related nodes in Y direction just as this node is being dragged in the Y direction
otherdata.Location =
new Point(otherdata.Location.X, data.Location.Y);
}
}
}
}
}
}