
Take the following steps to start a project and to add some code that will demonstrate the custom annotation features of the LEADTOOLS WinRT Annotations.
[C#]
using Leadtools.Annotations.Designers;
[C#]
public MainPage()
{
this.InitializeComponent();
RasterSupport.Initialize();
AnnAutomationManager manager = new AnnAutomationManager();
manager.CreateDefaultObjects();
AutomationControl viewerControl = new AutomationControl(_viewer);
_automation = new AnnAutomation(manager, viewerControl);
_rbDesignMode.IsChecked = true;
_automation.Active = true;
AddItem(_annObjects, AnnObject.SelectObjectId);
AddItem(_annObjects, AnnObject.PointerObjectId);
AddItem(_annObjects, AnnObject.RectangleObjectId);
AddItem(_annObjects, AnnObject.TextObjectId);
AddItem(_annObjects, AnnObject.RulerObjectId);
_annObjects.SelectedIndex = 0;
AnnTriangleObject triangle = new AnnTriangleObject();
// Create user defined automation object
AnnAutomationObject triangleAutomation = CreateTriangleAutomationObject(triangle);
_automation.Manager.Objects.Add(triangleAutomation);
AddItem(_annObjects, triangleAutomation.Id);
}
[C#]
private AnnAutomationObject CreateTriangleAutomationObject(AnnObject annObject)
{
AnnAutomationObject automationObj = new AnnAutomationObject();
automationObj.Id = annObject.Id;
automationObj.Name = "Triangle";
automationObj.DrawDesignerType = typeof(AnnTriangleDrawDesigner); // hook the custom draw designer
automationObj.EditDesignerType = typeof(AnnPolylineEditDesigner); // hook the custom edit designer
automationObj.RunDesignerType = typeof(AnnRunDesigner);
AnnTriangleRenderer annTriangleRenderer = new AnnTriangleRenderer();
IAnnObjectRenderer annPolylineRenderer = AnnRenderingEngine.Renderers[AnnObject.PolylineObjectId];
annTriangleRenderer.LocationsThumbStyle = annPolylineRenderer.LocationsThumbStyle;
annTriangleRenderer.RotateCenterThumbStyle = annPolylineRenderer.RotateCenterThumbStyle;
annTriangleRenderer.RotateGripperThumbStyle = annPolylineRenderer.RotateGripperThumbStyle;
AnnRenderingEngine.Renderers[annObject.Id] = annTriangleRenderer; // hook the custom renderer
automationObj.ObjectTemplate = annObject;
return automationObj;
}
In the "Solution Explorer" window, right-click on the "Project Name" and select "Add" from the context menu then select "New Item...". In the "Add New Item" dialog box, select
Classand Name it TriangleObjectstrong> from Code tree view item in Visual C#
[C#]
using Leadtools;
using Leadtools.Annotations.Rendering;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Media;
using Leadtools.Annotations.Core;
using Windows.Foundation;
using Windows.UI.Xaml.Shapes;
using Windows.UI;
using Leadtools.Annotations.Designers;
[C#]
public class AnnTriangleRenderer : AnnPolylineObjectRenderer
{
private LeadPointD[] _points;
private GeometryGroup _group = new GeometryGroup();
private AnnObject _annObject;
public override List<FrameworkElement> VisualComponents
{
get
{
List<FrameworkElement> _visualComponents = base.VisualComponents;
if (_group.Children.Count < 2)
{
_group.Children.Add(new EllipseGeometry());
_group.Children.Add(new EllipseGeometry());
}
if (_points.Length > 0)
{
EllipseGeometry ellipse = (EllipseGeometry)_group.Children[0];
ellipse.RadiusX = 10;
ellipse.RadiusY = 10;
ellipse.Center = new Point(_points[0].X, _points[0].Y);
if (_points.Length == 2)
{
ellipse = (EllipseGeometry)_group.Children[1];
ellipse.RadiusX = 10;
ellipse.RadiusY = 10;
ellipse.Center = new Point(_points[1].X, _points[1].Y);
}
}
if (_visualComponents.Count == 1)
{
_visualComponents.Add(new Path());
}
Path path = (Path)_visualComponents[1];
// if we are finished 'drawing', allow the base class AnnPolylineObjectRenderer to handle the job
if (_annObject.Tag == null || "drawing".CompareTo((string)_annObject.Tag) != 0)
{
path.Data = null;
_group.Children.Clear();
}
else
{
path.Data = _group;
}
path.Stroke = new SolidColorBrush(Colors.Green);
path.StrokeThickness = 2;
return _visualComponents;
}
}
public override void Render(AnnContainerMapper mapper, AnnObject annObject)
{
_annObject = annObject;
_points = mapper.PointsFromContainerCoordinates(annObject.Points.ToArray(), annObject.FixedStateOperations);
base.Render(mapper, annObject);
}
}
public class AnnTriangleDrawDesigner : AnnDrawDesigner
{
public AnnTriangleDrawDesigner(IAnnAutomationControl automationControl, AnnContainer container, AnnObject annObject)
: base(automationControl, container, annObject)
{
}
// override the onPointerDown method and add 3 points for our triangle
public override bool OnPointerDown(AnnContainer container, AnnPointerEventArgs e)
{
bool handled = base.OnPointerDown(container, e);
AnnObject targetObject = this.TargetObject;
if (targetObject.Points.Count < 3)
{
targetObject.Tag = "drawing";
this.StartWorking();
targetObject.Points.Add(e.Location);
handled = true;
}
return handled;
}
// override the onPointerUp method and end the drawing when we have our 3 points
public override bool OnPointerUp(AnnContainer container, AnnPointerEventArgs e)
{
bool handled = base.OnPointerUp(container, e);
handled = true;
AnnObject targetObject = this.TargetObject;
if (targetObject.Points.Count >= 3)
{
targetObject.Tag = null;
this.EndWorking();
}
return handled;
}
}
public class AnnTriangleObject : AnnPolylineObject
{
public AnnTriangleObject()
: base()
{
this.IsClosed = true; // triangle is a closed figure
this.SetId(-99); // set the object id
this.Tag = null;
}
protected override AnnObject Create()
{
return new AnnTriangleObject();
}
public override string FriendlyName
{
get
{
return "Triangle";
}
}
}
Build, and Run the program to test it.
Use the combo box below the viewer to select annotations. The radio buttons will allow you to switch between design and run mode.