LEADTOOLS Annotations for WPF and Silverlight (Leadtools.Windows.Annotations assembly) Send comments on this topic. | Back to Introduction - All Topics | Help Version 17.0.3.31
AnnDesigner Class
See Also  Members  
Leadtools.Windows.Annotations Namespace : AnnDesigner Class



The AnnDesigner Class supports WPF/Silverlight.

The AnnDesigner Class is available in LEADTOOLS Document and Medical Imaging toolkits.

The base class for all the designers in the annotation toolkit. Supported in Silverlight, Windows Phone 7

Object Model

AnnDesigner ClassAnnContainer Class

Syntax

Visual Basic (Declaration) 
Public MustInherit Class AnnDesigner 
Visual Basic (Usage)Copy Code
Dim instance As AnnDesigner
C# 
public abstract class AnnDesigner 
C++/CLI 
public ref class AnnDesigner abstract 

Example

Visual BasicCopy Code
''' Shows how to use designers to create and select annotation objects
   Private Class MyWindow1 : Inherits Window
      Private container As AnnContainer
      'AnnAutomationManager manager;
      Private viewer As ImageViewer
      Private currentDesigner As AnnDesigner
      Public Sub New(ByVal title As String)
         Me.Title = title
         Me.Width = 500
         Me.Height = 200

         viewer = New ImageViewer()

         ' load an image into the viewer
         viewer.Source = New BitmapImage(New Uri(Path.Combine(LEAD_VARS.ImagesDir, "cannon.jpg"))) ' fix this path to an existing image file on your system
         viewer.Width = Double.NaN
         viewer.Height = Double.NaN

         ' create and set up the container
         container = New AnnContainer()
         container.Width = viewer.Source.Width
         container.Height = viewer.Source.Height

         AddHandler container.MouseLeftButtonDown, AddressOf container_MouseLeftButtonDown
         AddHandler container.MouseMove, AddressOf container_MouseMove
         AddHandler container.MouseLeftButtonUp, AddressOf container_MouseLeftButtonUp

         ' Set the container as a content of viewer
         viewer.Content = container

         ' Create a panel with three buttons
         Dim stackPanel As StackPanel = New StackPanel()
         DockPanel.SetDock(stackPanel, Dock.Top)

         ' Create three buttons
         Dim buttonLine As Button = New Button()
         AddHandler buttonLine.Click, AddressOf buttonLine_Click
         buttonLine.Content = "Line"
         stackPanel.Children.Add(buttonLine)

         Dim buttonRectangle As Button = New Button()
         AddHandler buttonRectangle.Click, AddressOf buttonRectangle_Click
         buttonRectangle.Content = "Rectangle"
         stackPanel.Children.Add(buttonRectangle)

         Dim buttonSelect As Button = New Button()
         AddHandler buttonSelect.Click, AddressOf buttonSelect_Click
         buttonSelect.Content = "Select"
         stackPanel.Children.Add(buttonSelect)

         ' Add the viewer
         Dim panel As DockPanel = New DockPanel()
         panel.Children.Add(viewer)

         ' set panel as content
         Me.Content = panel
      End Sub

      Private Sub buttonSelect_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
         ' Select button is clicked
         ' cancel any draw designer running
         If Not currentDesigner Is Nothing AndAlso TypeOf currentDesigner Is AnnDrawDesigner Then
            Dim drawDesigner As AnnDrawDesigner = DirectCast(currentDesigner, AnnDrawDesigner)
            drawDesigner.Cancel()
            currentDesigner = Nothing
         End If
      End Sub

      Private Sub buttonLine_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
         ' Line button is clicked

         ' first end any current designer (if any)
         EndDesigner()

         ' start a new Line draw designer
         Dim lineDrawDesigner As AnnLineDrawDesigner = New AnnLineDrawDesigner(Me.container)

         ' set up the object template (a 2 pixels-wide pen)
         Dim lineObject As AnnLineObject = New AnnLineObject()
         lineObject.Stroke = Colors.Red
         lineObject.StrokeThickness = 2.0
         lineDrawDesigner.ObjectTemplate = lineObject

         StartDrawDesigner(lineDrawDesigner)
      End Sub


      Private Sub buttonRectangle_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
         ' Rectangle button is clicked

         ' first end any current designer (if any)
         EndDesigner()

         ' start a new Rectangle draw designer
         Dim rectangleDrawDesigner As AnnRectangleDrawDesigner = New AnnRectangleDrawDesigner(Me.container)

         ' set up the object template (a 2 pixels-wide pen)
         Dim rectangleObject As AnnRectangleObject = New AnnRectangleObject()
         rectangleObject.Stroke = Colors.Red
         rectangleObject.StrokeThickness = 2.0
         rectangleObject.Fill = Colors.Yellow
         rectangleDrawDesigner.ObjectTemplate = rectangleObject

         StartDrawDesigner(rectangleDrawDesigner)
      End Sub

      Private Sub EndDesigner()
         ' ends any running designer
         If Not currentDesigner Is Nothing Then
            If TypeOf currentDesigner Is AnnEditDesigner Then
               Dim editDesigner As AnnEditDesigner = DirectCast(currentDesigner, AnnEditDesigner)
               editDesigner.End()
            ElseIf TypeOf currentDesigner Is AnnDrawDesigner Then
               Dim drawDesigner As AnnDrawDesigner = DirectCast(currentDesigner, AnnDrawDesigner)
               drawDesigner.Cancel()
            End If
         End If
      End Sub

      Private Sub StartDrawDesigner(ByVal drawDesigner As AnnDrawDesigner)
         ' set up the current designer
         AddHandler drawDesigner.Draw, AddressOf OnDesignerDraw
         currentDesigner = drawDesigner
      End Sub

      Private Sub OnDesignerDraw(ByVal sender As Object, ByVal e As AnnDrawDesignerEventArgs)
         ' show information on the current draw operation
         Console.Write("Status: {0}, Object: {1}, Coordinates:", e.OperationStatus, e.Object.GetType().Name)
         If TypeOf e.Object Is AnnLineObject Then
            Dim lineObject As AnnLineObject = DirectCast(e.Object, AnnLineObject)
            Console.WriteLine("Start Point: {{0},{1}}, EndPoint: {{2},{3}}", lineObject.Start.X, lineObject.Start.Y, lineObject.End.X, lineObject.End.Y)
         ElseIf TypeOf e.Object Is AnnRectangleObject Then
            Dim rectangleObject As AnnRectangleObject = DirectCast(e.Object, AnnRectangleObject)
            Console.WriteLine("Left: {0}", rectangleObject.Rect.Left)
            Console.WriteLine("Top: {0}", rectangleObject.Rect.Top)
            Console.WriteLine("Width: {0}", rectangleObject.Rect.Width)
            Console.WriteLine("Height: {0}", rectangleObject.Rect.Height)
         End If
      End Sub

      Private Sub container_MouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
         ' see if a designer is currently running, if so, let it handle this event
         If Not currentDesigner Is Nothing Then
            e = New MouseButtonEventArgs(InputManager.Current.PrimaryMouseDevice, e.Timestamp, MouseButton.Left)
            currentDesigner.OnMouseLeftButtonDown(DirectCast(sender, AnnContainer), e)
         End If

         If (Not e.Handled) Then
            ' the mouse click was ! handled by a designer
            ' check if the click was on top of an existing object that we can start editing
            Dim pt As System.Windows.Point = e.GetPosition(container)
            Dim obj As AnnObject = container.HitTest(pt)
            If Not obj Is Nothing Then
               ' yes, start the edit designer for this object
               If TypeOf obj Is AnnLineObject Then
                  Dim lineEditDesigner As New AnnLineEditDesigner(DirectCast(obj, AnnLineObject), DirectCast(viewer.Content, AnnContainer))
                  StartEditing(lineEditDesigner, obj, pt)
                  lineEditDesigner.OnMouseLeftButtonDown(DirectCast(sender, AnnContainer), e)
               ElseIf TypeOf obj Is AnnRectangleObject Then
                  Dim rectangleEditDesigner As New AnnRectangleEditDesigner(DirectCast(obj, AnnRectangleObject), DirectCast(viewer.Content, AnnContainer))
                  StartEditing(rectangleEditDesigner, obj, pt)
                  rectangleEditDesigner.OnMouseLeftButtonDown(DirectCast(sender, AnnContainer), e)
               End If
            End If
         End If
      End Sub

      Private Sub StartEditing(ByVal editDesigner As AnnEditDesigner, ByVal obj As AnnObject, ByVal pt As System.Windows.Point)
         ' first end any running designers
         EndDesigner()

         ' set up the current designer
         AddHandler editDesigner.Edit, AddressOf OnDesignerEdit
         editDesigner.RotateModifierKey = ModifierKeys.Shift

         Dim i As Integer = 0
         Do While i < editDesigner.ControlPointCount
            ' set up the edit designer control points
            Dim cp As System.Windows.Controls.Primitives.Thumb = New System.Windows.Controls.Primitives.Thumb()
            cp.Width = 10
            cp.Height = 10

            cp.BorderBrush = Brushes.Blue
            cp.BorderThickness = New Thickness(1.0)
            cp.Background = Brushes.White
            editDesigner.ControlPoints(i) = cp
            i += 1
         Loop

         editDesigner.Start()
         currentDesigner = editDesigner
      End Sub

      Private Sub OnDesignerEdit(ByVal sender As Object, ByVal e As AnnEditDesignerEventArgs)
         ' show information on the current draw operation
         Console.Write("Object: {0}, Operation: {1}, Status: {2}, ", e.Object.GetType().Name, e.Operation, e.OperationStatus)
         If e.Operation = AnnEditDesignerOperation.MoveControlPoint Then
            Console.WriteLine("Control Point index: {0}", e.MoveControlPointIndex)
         End If
      End Sub

      Private Sub container_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
         ' see if a designer is currently running, if so, let it handle this event
         If Not currentDesigner Is Nothing Then
            e = New MouseEventArgs(InputManager.Current.PrimaryMouseDevice, e.Timestamp)

            currentDesigner.OnMouseMove(DirectCast(sender, AnnContainer), e)
         End If
      End Sub

      Private Sub container_MouseLeftButtonUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
         ' see if a designer is currently running, if so, let it handle this event
         If Not currentDesigner Is Nothing Then
            e = New MouseButtonEventArgs(InputManager.Current.PrimaryMouseDevice, e.Timestamp, MouseButton.Left)
            currentDesigner.OnMouseLeftButtonUp(DirectCast(sender, AnnContainer), e)
         End If
      End Sub
   End Class

   Public Sub AnnDesigner_AnnDesigner(ByVal title As String)
      Dim form As MyWindow1 = New MyWindow1(title)
      form.ShowDialog()
   End Sub


Public NotInheritable Class LEAD_VARS
   Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images"
End Class
C#Copy Code
/// Shows how to use designers to create and select annotation objects
   class MyWindow1 : Window
   {
      AnnContainer container;
      //AnnAutomationManager manager;
      ImageViewer viewer;
      AnnDesigner currentDesigner;
      public MyWindow1(string title)
      {
         this.Title = title;
         this.Width = 500;
         this.Height = 200;

         viewer = new ImageViewer();

         // load an image into the viewer
         viewer.Source = new BitmapImage(new Uri(Path.Combine(LEAD_VARS.ImagesDir, "cannon.jpg")));  // fix this path to an existing image file on your system
         viewer.Width = double.NaN;
         viewer.Height = double.NaN;

         // create and set up the container
         container = new AnnContainer();
         container.Width = viewer.Source.Width;
         container.Height = viewer.Source.Height;

         container.MouseLeftButtonDown += new MouseButtonEventHandler(container_MouseLeftButtonDown);
         container.MouseMove += new MouseEventHandler(container_MouseMove);
         container.MouseLeftButtonUp += new MouseButtonEventHandler(container_MouseLeftButtonUp);

         // Set the container as a content of viewer
         viewer.Content = container;

         // Create a panel with three buttons
         StackPanel stackPanel = new StackPanel();
         DockPanel.SetDock(stackPanel, Dock.Top);

         // Create three buttons
         Button buttonLine = new Button();
         buttonLine.Click += new RoutedEventHandler(buttonLine_Click);
         buttonLine.Content = "Line";
         stackPanel.Children.Add(buttonLine);

         Button buttonRectangle = new Button();
         buttonRectangle.Click += new RoutedEventHandler(buttonRectangle_Click);
         buttonRectangle.Content = "Rectangle";
         stackPanel.Children.Add(buttonRectangle);

         Button buttonSelect = new Button();
         buttonSelect.Click += new RoutedEventHandler(buttonSelect_Click);
         buttonSelect.Content = "Select";
         stackPanel.Children.Add(buttonSelect);

         // Add the viewer
         DockPanel panel = new DockPanel();
         panel.Children.Add(viewer);

         // set panel as content
         this.Content = panel;
      }

      private void buttonSelect_Click(object sender, System.EventArgs e)
      {
         // Select button is clicked
         // cancel any draw designer running
         if(currentDesigner != null && currentDesigner is AnnDrawDesigner)
         {
            AnnDrawDesigner drawDesigner = currentDesigner as AnnDrawDesigner;
            drawDesigner.Cancel();
            currentDesigner = null;
         }
      }

      private void buttonLine_Click(object sender, RoutedEventArgs e)
      {
         // Line button is clicked

         // first end any current designer (if any)
         EndDesigner();

         // start a new Line draw designer
         AnnLineDrawDesigner lineDrawDesigner = new AnnLineDrawDesigner(this.container);

         // set up the object template (a 2 pixels-wide pen)
         AnnLineObject lineObject = new AnnLineObject();
         lineObject.Stroke = Colors.Red;
         lineObject.StrokeThickness = 2.0;
         lineDrawDesigner.ObjectTemplate = lineObject;

         StartDrawDesigner(lineDrawDesigner);
      }


      private void buttonRectangle_Click(object sender, RoutedEventArgs e)
      {
         // Rectangle button is clicked

         // first end any current designer (if any)
         EndDesigner();

         // start a new Rectangle draw designer
         AnnRectangleDrawDesigner rectangleDrawDesigner = new AnnRectangleDrawDesigner(this.container);

         // set up the object template (a 2 pixels-wide pen)
         AnnRectangleObject rectangleObject = new AnnRectangleObject();
         rectangleObject.Stroke = Colors.Red;
         rectangleObject.Fill = Colors.Yellow;
         rectangleObject.StrokeThickness = 2.0;
         rectangleDrawDesigner.ObjectTemplate = rectangleObject;

         StartDrawDesigner(rectangleDrawDesigner);
      }

      private void EndDesigner()
      {
         // ends any running designer
         if(currentDesigner != null)
         {
            if(currentDesigner is AnnEditDesigner)
            {
               AnnEditDesigner editDesigner = currentDesigner as AnnEditDesigner;
               editDesigner.End();
            }
            else if(currentDesigner is AnnDrawDesigner)
            {
               AnnDrawDesigner drawDesigner = currentDesigner as AnnDrawDesigner;
               drawDesigner.Cancel();
            }
         }
      }

      private void StartDrawDesigner(AnnDrawDesigner drawDesigner)
      {
         // set up the current designer
         drawDesigner.Draw += new EventHandler<AnnDrawDesignerEventArgs>(OnDesignerDraw);
         currentDesigner = drawDesigner;
      }

      private void OnDesignerDraw(object sender, AnnDrawDesignerEventArgs e)
      {
         // show information on the current draw operation
         Console.Write("Status: {0}, Object: {1}, Coordinates:", e.OperationStatus, e.Object.GetType().Name);
         if(e.Object is AnnLineObject)
         {
            AnnLineObject lineObject = e.Object as AnnLineObject;
            Console.WriteLine("Start Point: {{0},{1}}, EndPoint: {{2},{3}}", lineObject.Start.X, lineObject.Start.Y, lineObject.End.X, lineObject.End.Y);
         }
         else if(e.Object is AnnRectangleObject)
         {
            AnnRectangleObject rectangleObject = e.Object as AnnRectangleObject;
            Console.WriteLine("Left: {0}", rectangleObject.Rect.Left);
            Console.WriteLine("Top: {0}", rectangleObject.Rect.Top);
            Console.WriteLine("Width: {0}", rectangleObject.Rect.Width);
            Console.WriteLine("Height: {0}", rectangleObject.Rect.Height);
         }
      }

      void container_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
      {
         // see if a designer is currently running, if so, let it handle this event
         if(currentDesigner != null)
         {
            e = new MouseButtonEventArgs(InputManager.Current.PrimaryMouseDevice,
               e.Timestamp,
               MouseButton.Left);
            currentDesigner.OnMouseLeftButtonDown(sender as AnnContainer, e);
         }

         if(!e.Handled)
         {
            // the mouse click was ! handled by a designer
            // check if the click was on top of an existing object that we can start editing
            Point pt = e.GetPosition(container);
            AnnObject obj = container.HitTest(pt);
            if (obj != null)
            {
               // yes, start the edit designer for this object
               if(obj is AnnLineObject)
               {
                  AnnLineEditDesigner lineEditDesigner = new AnnLineEditDesigner(obj as AnnLineObject, viewer.Content as AnnContainer);
                  StartEditing(lineEditDesigner, obj, pt);
                  lineEditDesigner.OnMouseLeftButtonDown(sender as AnnContainer, e);
               }
               else if(obj is AnnRectangleObject)
               {
                  AnnRectangleEditDesigner rectangleEditDesigner = new AnnRectangleEditDesigner(obj as AnnRectangleObject, viewer.Content as AnnContainer);
                  StartEditing(rectangleEditDesigner, obj, pt);
                  rectangleEditDesigner.OnMouseLeftButtonDown(sender as AnnContainer, e);
               }
            }
         }
      }

      private void StartEditing(AnnEditDesigner editDesigner, AnnObject obj, Point pt)
      {
         // first end any running designers
         EndDesigner();

         // set up the current designer
         editDesigner.Edit += new EventHandler<AnnEditDesignerEventArgs>(OnDesignerEdit);
         editDesigner.RotateModifierKey = ModifierKeys.Shift;

         for(int i = 0; i < editDesigner.ControlPointCount; i++)
         {
            // set up the edit designer control points
            System.Windows.Controls.Primitives.Thumb cp = new System.Windows.Controls.Primitives.Thumb();
            cp.Width = cp.Height = 10;;
            cp.BorderBrush = Brushes.Blue;
            cp.BorderThickness = new Thickness(1.0);
            cp.Background = Brushes.White;
            editDesigner.ControlPoints[i] = cp;
         }

         editDesigner.Start();
         currentDesigner = editDesigner;
      }

      private void OnDesignerEdit(object sender, AnnEditDesignerEventArgs e)
      {
         // show information on the current draw operation
         Console.Write("Object: {0}, Operation: {1}, Status: {2}, ", e.Object.GetType().Name, e.Operation, e.OperationStatus);
         if(e.Operation == AnnEditDesignerOperation.MoveControlPoint)
            Console.WriteLine("Control Point index: {0}", e.MoveControlPointIndex);
      }

      void container_MouseMove(object sender, MouseEventArgs e)
      {
         // see if a designer is currently running, if so, let it handle this event
         if(currentDesigner != null)
         {
            e = new MouseEventArgs(InputManager.Current.PrimaryMouseDevice,
               e.Timestamp);
            currentDesigner.OnMouseMove(sender as AnnContainer,e);
         }
      }

      void container_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
      {
         // see if a designer is currently running, if so, let it handle this event
         if(currentDesigner != null)
         {
            e = new MouseButtonEventArgs(InputManager.Current.PrimaryMouseDevice,
               e.Timestamp,
               MouseButton.Left);

            currentDesigner.OnMouseLeftButtonUp(sender as AnnContainer, e);
         }
      }
   }

   public void AnnDesigner_AnnDesigner(string title)
   {
      MyWindow1 form = new MyWindow1(title);
      form.ShowDialog();
   }


static class LEAD_VARS
{
   public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images";
}
SilverlightCSharpCopy Code
/// Shows how to use designers to create and select annotation objects
class MyWindow1 : ChildWindow
{
   AnnContainer container;
   //AnnAutomationManager manager;
   ImageViewer viewer;
   AnnDesigner currentDesigner;
   public MyWindow1(string title)
   {
      this.Title = title;
      this.Width = 500;
      this.Height = 200;

      viewer = new ImageViewer();

      // load an image into the viewer
      viewer.Source = new BitmapImage(new Uri(LeadtoolsExamples.Common.ImagesPath.Path + "ScarletMacaws.jpg"));  // fix this path to an existing image file on your system
      viewer.Width = double.NaN;
      viewer.Height = double.NaN;

      // create and set up the container
      container = new AnnContainer();
      container.Width = ((BitmapSource)viewer.Source).PixelWidth;
      container.Height = ((BitmapSource)viewer.Source).PixelHeight;

      container.MouseLeftButtonDown += new MouseButtonEventHandler(container_MouseLeftButtonDown);
      container.MouseMove += new MouseEventHandler(container_MouseMove);
      container.MouseLeftButtonUp += new MouseButtonEventHandler(container_MouseLeftButtonUp);

      // Set the container as a content of viewer
      viewer.Content = container;

      // Create a panel with three buttons
      StackPanel stackPanel = new StackPanel();

      // Create three buttons
      Button buttonLine = new Button();
      buttonLine.Click += new RoutedEventHandler(buttonLine_Click);
      buttonLine.Content = "Line";
      stackPanel.Children.Add(buttonLine);

      Button buttonRectangle = new Button();
      buttonRectangle.Click += new RoutedEventHandler(buttonRectangle_Click);
      buttonRectangle.Content = "Rectangle";
      stackPanel.Children.Add(buttonRectangle);

      Button buttonSelect = new Button();
      buttonSelect.Click += new RoutedEventHandler(buttonSelect_Click);
      buttonSelect.Content = "Select";
      stackPanel.Children.Add(buttonSelect);

      // Add the viewer
      StackPanel panel = new StackPanel();
      panel.Children.Add(viewer);

      // set panel as content
      this.Content = panel;
   }

   private void buttonSelect_Click(object sender, System.EventArgs e)
   {
      // Select button is clicked
      // cancel any draw designer running
      if(currentDesigner != null && currentDesigner is AnnDrawDesigner)
      {
         AnnDrawDesigner drawDesigner = currentDesigner as AnnDrawDesigner;
         drawDesigner.Cancel();
         currentDesigner = null;
      }
   }

   private void buttonLine_Click(object sender, RoutedEventArgs e)
   {
      // Line button is clicked

      // first end any current designer (if any)
      EndDesigner();

      // start a new Line draw designer
      AnnLineDrawDesigner lineDrawDesigner = new AnnLineDrawDesigner(this.container);

      // set up the object template (a 2 pixels-wide pen)
      AnnLineObject lineObject = new AnnLineObject();
      lineObject.Stroke = Colors.Red;
      lineObject.StrokeThickness = 2.0;
      lineDrawDesigner.ObjectTemplate = lineObject;

      StartDrawDesigner(lineDrawDesigner);
   }


   private void buttonRectangle_Click(object sender, RoutedEventArgs e)
   {
      // Rectangle button is clicked

      // first end any current designer (if any)
      EndDesigner();

      // start a new Rectangle draw designer
      AnnRectangleDrawDesigner rectangleDrawDesigner = new AnnRectangleDrawDesigner(this.container);

      // set up the object template (a 2 pixels-wide pen)
      AnnRectangleObject rectangleObject = new AnnRectangleObject();
      rectangleObject.Stroke = Colors.Red;
      rectangleObject.Fill = Colors.Yellow;
      rectangleObject.StrokeThickness = 2.0;
      rectangleDrawDesigner.ObjectTemplate = rectangleObject;

      StartDrawDesigner(rectangleDrawDesigner);
   }

   private void EndDesigner()
   {
      // ends any running designer
      if(currentDesigner != null)
      {
         if(currentDesigner is AnnEditDesigner)
         {
            AnnEditDesigner editDesigner = currentDesigner as AnnEditDesigner;
            editDesigner.End();
         }
         else if(currentDesigner is AnnDrawDesigner)
         {
            AnnDrawDesigner drawDesigner = currentDesigner as AnnDrawDesigner;
            drawDesigner.Cancel();
         }
      }
   }

   private void StartDrawDesigner(AnnDrawDesigner drawDesigner)
   {
      // set up the current designer
      drawDesigner.Draw += new EventHandler<AnnDrawDesignerEventArgs>(OnDesignerDraw);
      currentDesigner = drawDesigner;
   }

   private void OnDesignerDraw(object sender, AnnDrawDesignerEventArgs e)
   {
      // show information on the current draw operation
      Console.Write("Status: {0}, Object: {1}, Coordinates:", e.OperationStatus, e.Object.GetType().Name);
      if(e.Object is AnnLineObject)
      {
         AnnLineObject lineObject = e.Object as AnnLineObject;
         Console.WriteLine("Start Point: {{0},{1}}, EndPoint: {{2},{3}}", lineObject.Start.X, lineObject.Start.Y, lineObject.End.X, lineObject.End.Y);
      }
      else if(e.Object is AnnRectangleObject)
      {
         AnnRectangleObject rectangleObject = e.Object as AnnRectangleObject;
         Console.WriteLine("Left: {0}", rectangleObject.Rect.Left);
         Console.WriteLine("Top: {0}", rectangleObject.Rect.Top);
         Console.WriteLine("Width: {0}", rectangleObject.Rect.Width);
         Console.WriteLine("Height: {0}", rectangleObject.Rect.Height);
      }
   }

   void container_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
   {
      // see if a designer is currently running, if so, let it handle this event
      if(currentDesigner != null)
      {
         currentDesigner.OnMouseLeftButtonDown(sender as AnnContainer, e);
      }

      if(!e.Handled)
      {
         // the mouse click was ! handled by a designer
         // check if the click was on top of an existing object that we can start editing
         Point pt = e.GetPosition(container);
         AnnObject obj = container.HitTest(pt);
         if (obj != null)
         {
            // yes, start the edit designer for this object
            if(obj is AnnLineObject)
            {
               AnnLineEditDesigner lineEditDesigner = new AnnLineEditDesigner(obj as AnnLineObject, viewer.Content as AnnContainer);
               StartEditing(lineEditDesigner, obj, pt);
               lineEditDesigner.OnMouseLeftButtonDown(sender as AnnContainer, e);
            }
            else if(obj is AnnRectangleObject)
            {
               AnnRectangleEditDesigner rectangleEditDesigner = new AnnRectangleEditDesigner(obj as AnnRectangleObject, viewer.Content as AnnContainer);
               StartEditing(rectangleEditDesigner, obj, pt);
               rectangleEditDesigner.OnMouseLeftButtonDown(sender as AnnContainer, e);
            }
         }
      }
   }

   private void StartEditing(AnnEditDesigner editDesigner, AnnObject obj, Point pt)
   {
      // first end any running designers
      EndDesigner();

      // set up the current designer
      editDesigner.Edit += new EventHandler<AnnEditDesignerEventArgs>(OnDesignerEdit);
      editDesigner.RotateModifierKey = ModifierKeys.Shift;

      for(int i = 0; i < editDesigner.ControlPointCount; i++)
      {
         // set up the edit designer control points
         System.Windows.Controls.Primitives.Thumb cp = new System.Windows.Controls.Primitives.Thumb();
         cp.Width = cp.Height = 10;;
         cp.BorderBrush = new SolidColorBrush(Colors.Blue);
         cp.BorderThickness = new Thickness(1.0);
         cp.Background = new SolidColorBrush(Colors.White);
         editDesigner.ControlPoints[i] = cp;
      }

      editDesigner.Start();
      currentDesigner = editDesigner;
   }

   private void OnDesignerEdit(object sender, AnnEditDesignerEventArgs e)
   {
      // show information on the current draw operation
      Console.Write("Object: {0}, Operation: {1}, Status: {2}, ", e.Object.GetType().Name, e.Operation, e.OperationStatus);
      if(e.Operation == AnnEditDesignerOperation.MoveControlPoint)
         Console.WriteLine("Control Point index: {0}", e.MoveControlPointIndex);
   }

   void container_MouseMove(object sender, MouseEventArgs e)
   {
      // see if a designer is currently running, if so, let it handle this event
      if(currentDesigner != null)
      {
         currentDesigner.OnMouseMove(sender as AnnContainer,e);
      }
   }

   void container_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
   {
      // see if a designer is currently running, if so, let it handle this event
      if(currentDesigner != null)
      {
         currentDesigner.OnMouseLeftButtonUp(sender as AnnContainer, e);
      }
   }
}

public void AnnDesigner_AnnDesigner(string title)
{
   MyWindow1 form = new MyWindow1(title);
   form.Show();
}
SilverlightVBCopy Code
''' Shows how to use designers to create and select annotation objects
Private Class MyWindow1 : Inherits ChildWindow
   Private container As AnnContainer
   'AnnAutomationManager manager;
   Private viewer As ImageViewer
   Private currentDesigner As AnnDesigner
   Public Sub New(ByVal title As String)
      Me.Title = title
      Me.Width = 500
      Me.Height = 200

      viewer = New ImageViewer()

      ' load an image into the viewer
      viewer.Source = New BitmapImage(New Uri(LeadtoolsExamples.Common.ImagesPath.Path & "ScarletMacaws.jpg")) ' fix this path to an existing image file on your system
      viewer.Width = Double.NaN
      viewer.Height = Double.NaN

      ' create and set up the container
      container = New AnnContainer()
      container.Width = (CType(viewer.Source, BitmapSource)).PixelWidth
      container.Height = (CType(viewer.Source, BitmapSource)).PixelHeight

      AddHandler container.MouseLeftButtonDown, AddressOf container_MouseLeftButtonDown
      AddHandler container.MouseMove, AddressOf container_MouseMove
      AddHandler container.MouseLeftButtonUp, AddressOf container_MouseLeftButtonUp

      ' Set the container as a content of viewer
      viewer.Content = container

      ' Create a panel with three buttons
      Dim stackPanel As StackPanel = New StackPanel()

      ' Create three buttons
      Dim buttonLine As Button = New Button()
      AddHandler buttonLine.Click, AddressOf buttonLine_Click
      buttonLine.Content = "Line"
      stackPanel.Children.Add(buttonLine)

      Dim buttonRectangle As Button = New Button()
      AddHandler buttonRectangle.Click, AddressOf buttonRectangle_Click
      buttonRectangle.Content = "Rectangle"
      stackPanel.Children.Add(buttonRectangle)

      Dim buttonSelect As Button = New Button()
      AddHandler buttonSelect.Click, AddressOf buttonSelect_Click
      buttonSelect.Content = "Select"
      stackPanel.Children.Add(buttonSelect)

      ' Add the viewer
      Dim panel As StackPanel = New StackPanel()
      panel.Children.Add(viewer)

      ' set panel as content
      Me.Content = panel
   End Sub

   Private Sub buttonSelect_Click(ByVal sender As Object, ByVal e As System.EventArgs)
      ' Select button is clicked
      ' cancel any draw designer running
      If Not currentDesigner Is Nothing AndAlso TypeOf currentDesigner Is AnnDrawDesigner Then
         Dim drawDesigner As AnnDrawDesigner = TryCast(currentDesigner, AnnDrawDesigner)
         drawDesigner.Cancel()
         currentDesigner = Nothing
      End If
   End Sub

   Private Sub buttonLine_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
      ' Line button is clicked

      ' first end any current designer (if any)
      EndDesigner()

      ' start a new Line draw designer
      Dim lineDrawDesigner As AnnLineDrawDesigner = New AnnLineDrawDesigner(Me.container)

      ' set up the object template (a 2 pixels-wide pen)
      Dim lineObject As AnnLineObject = New AnnLineObject()
      lineObject.Stroke = Colors.Red
      lineObject.StrokeThickness = 2.0
      lineDrawDesigner.ObjectTemplate = lineObject

      StartDrawDesigner(lineDrawDesigner)
   End Sub


   Private Sub buttonRectangle_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
      ' Rectangle button is clicked

      ' first end any current designer (if any)
      EndDesigner()

      ' start a new Rectangle draw designer
      Dim rectangleDrawDesigner As AnnRectangleDrawDesigner = New AnnRectangleDrawDesigner(Me.container)

      ' set up the object template (a 2 pixels-wide pen)
      Dim rectangleObject As AnnRectangleObject = New AnnRectangleObject()
      rectangleObject.Stroke = Colors.Red
      rectangleObject.Fill = Colors.Yellow
      rectangleObject.StrokeThickness = 2.0
      rectangleDrawDesigner.ObjectTemplate = rectangleObject

      StartDrawDesigner(rectangleDrawDesigner)
   End Sub

   Private Sub EndDesigner()
      ' ends any running designer
      If Not currentDesigner Is Nothing Then
         If TypeOf currentDesigner Is AnnEditDesigner Then
            Dim editDesigner As AnnEditDesigner = TryCast(currentDesigner, AnnEditDesigner)
            editDesigner.End()
         Else If TypeOf currentDesigner Is AnnDrawDesigner Then
            Dim drawDesigner As AnnDrawDesigner = TryCast(currentDesigner, AnnDrawDesigner)
            drawDesigner.Cancel()
         End If
      End If
   End Sub

   Private Sub StartDrawDesigner(ByVal drawDesigner As AnnDrawDesigner)
      ' set up the current designer
      AddHandler drawDesigner.Draw, AddressOf OnDesignerDraw
      currentDesigner = drawDesigner
   End Sub

   Private Sub OnDesignerDraw(ByVal sender As Object, ByVal e As AnnDrawDesignerEventArgs)
      ' show information on the current draw operation
      Console.Write("Status: {0}, Object: {1}, Coordinates:", e.OperationStatus, e.Object.GetType().Name)
      If TypeOf e.Object Is AnnLineObject Then
         Dim lineObject As AnnLineObject = TryCast(e.Object, AnnLineObject)
         Console.WriteLine("Start Point: {{0},{1}}, EndPoint: {{2},{3}}", lineObject.Start.X, lineObject.Start.Y, lineObject.End.X, lineObject.End.Y)
      Else If TypeOf e.Object Is AnnRectangleObject Then
         Dim rectangleObject As AnnRectangleObject = TryCast(e.Object, AnnRectangleObject)
         Console.WriteLine("Left: {0}", rectangleObject.Rect.Left)
         Console.WriteLine("Top: {0}", rectangleObject.Rect.Top)
         Console.WriteLine("Width: {0}", rectangleObject.Rect.Width)
         Console.WriteLine("Height: {0}", rectangleObject.Rect.Height)
      End If
   End Sub

   Private Sub container_MouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
      ' see if a designer is currently running, if so, let it handle this event
      If Not currentDesigner Is Nothing Then
         currentDesigner.OnMouseLeftButtonDown(TryCast(sender, AnnContainer), e)
      End If

      If (Not e.Handled) Then
         ' the mouse click was ! handled by a designer
         ' check if the click was on top of an existing object that we can start editing
         Dim pt As Point = e.GetPosition(container)
         Dim obj As AnnObject = container.HitTest(pt)
         If Not obj Is Nothing Then
            ' yes, start the edit designer for this object
            If TypeOf obj Is AnnLineObject Then
               Dim lineEditDesigner As AnnLineEditDesigner = New AnnLineEditDesigner(TryCast(obj, AnnLineObject), TryCast(viewer.Content, AnnContainer))
               StartEditing(lineEditDesigner, obj, pt)
               lineEditDesigner.OnMouseLeftButtonDown(TryCast(sender, AnnContainer), e)
            Else If TypeOf obj Is AnnRectangleObject Then
               Dim rectangleEditDesigner As AnnRectangleEditDesigner = New AnnRectangleEditDesigner(TryCast(obj, AnnRectangleObject), TryCast(viewer.Content, AnnContainer))
               StartEditing(rectangleEditDesigner, obj, pt)
               rectangleEditDesigner.OnMouseLeftButtonDown(TryCast(sender, AnnContainer), e)
            End If
         End If
      End If
   End Sub

   Private Sub StartEditing(ByVal editDesigner As AnnEditDesigner, ByVal obj As AnnObject, ByVal pt As Point)
      ' first end any running designers
      EndDesigner()

      ' set up the current designer
      AddHandler editDesigner.Edit, AddressOf OnDesignerEdit
      editDesigner.RotateModifierKey = ModifierKeys.Shift

      Dim i As Integer = 0
      Do While i < editDesigner.ControlPointCount
         ' set up the edit designer control points
         Dim cp As System.Windows.Controls.Primitives.Thumb = New System.Windows.Controls.Primitives.Thumb()
         cp.Width = 10
         cp.Height = 10

         cp.BorderBrush = New SolidColorBrush(Colors.Blue)
         cp.BorderThickness = New Thickness(1.0)
         cp.Background = New SolidColorBrush(Colors.White)
         editDesigner.ControlPoints(i) = cp
         i += 1
      Loop

      editDesigner.Start()
      currentDesigner = editDesigner
   End Sub

   Private Sub OnDesignerEdit(ByVal sender As Object, ByVal e As AnnEditDesignerEventArgs)
      ' show information on the current draw operation
      Console.Write("Object: {0}, Operation: {1}, Status: {2}, ", e.Object.GetType().Name, e.Operation, e.OperationStatus)
      If e.Operation = AnnEditDesignerOperation.MoveControlPoint Then
         Console.WriteLine("Control Point index: {0}", e.MoveControlPointIndex)
      End If
   End Sub

   Private Sub container_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
      ' see if a designer is currently running, if so, let it handle this event
      If Not currentDesigner Is Nothing Then
         currentDesigner.OnMouseMove(TryCast(sender, AnnContainer),e)
      End If
   End Sub

   Private Sub container_MouseLeftButtonUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
      ' see if a designer is currently running, if so, let it handle this event
      If Not currentDesigner Is Nothing Then
         currentDesigner.OnMouseLeftButtonUp(TryCast(sender, AnnContainer), e)
      End If
   End Sub
End Class

Public Sub AnnDesigner_AnnDesigner(ByVal title As String)
   Dim form As MyWindow1 = New MyWindow1(title)
   form.Show()
End Sub

Remarks

An AnnDesigner derived class controls the user interface functionality involved in drawing, editing or running an object. This class provides the basic functionality common to all the designers such as hooking into a container, clipping the mouse cursor, etc.

You pass an AnnContainer object to this class constructor. Then based on the exact designer functionality, it will hook into the various mouse events to draw a new, edit an existing (by moving, resizing, etc.) or run (if the container is in run user mode) an AnnObject.

Inheritance Hierarchy

Requirements

Target Platforms: Silverlight 3.0, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7, MAC OS/X (Intel Only)

See Also

AnnDesigner requires a Document/Medical product license and unlock key. For more information, refer to: Imaging Pro/Document/Medical Features and Unlocking Special LEAD Features.