/// <summary>
        /// Update the view of the binding values
        /// </summary>
        /// <param name="binding"></param>
        private QuadDetectorBindingInputFeatureValues ExtractBindingValues(ISkillBinding binding)
        {
            QuadDetectorBindingInputFeatureValues result = new QuadDetectorBindingInputFeatureValues();

            result.SubMarginPercentage = (binding["SubRectangleMargin"].FeatureValue as SkillFeatureTensorIntValue).GetAsVectorView()[0];
            result.MaxDetectedQuads    = (binding["MaxDetectedQuads"].FeatureValue as SkillFeatureTensorIntValue).GetAsVectorView()[0];
            result.NumberOfEdgePixels  = (binding["NumberOfEdgePixels"].FeatureValue as SkillFeatureTensorIntValue).GetAsVectorView()[0];

            var baseQuadFeature      = binding["BaseQuad"].FeatureValue;
            var baseQuadFeatureValue = (baseQuadFeature as SkillFeatureTensorFloatValue).GetAsVectorView();

            for (int i = 0; i < baseQuadFeatureValue.Count; i += 2)
            {
                result.BaseQuad[i / 2] = new Point(baseQuadFeatureValue[i], baseQuadFeatureValue[i + 1]);
            }

            result.UseCenterPoint = (binding["UseCenterPoint"].FeatureValue as SkillFeatureTensorBooleanValue).GetAsVectorView()[0];

            var centerPointFeature = binding["CenterPoint"].FeatureValue;
            var centerPointTensor  = (centerPointFeature as SkillFeatureTensorFloatValue).GetAsVectorView();

            if (centerPointTensor.Count > 0)
            {
                result.CenterPointCoordinates.X = centerPointTensor[0];
                result.CenterPointCoordinates.Y = centerPointTensor[1];
            }

            return(result);
        }
 /// <summary>
 /// Update displayed input values
 /// </summary>
 /// <param name="initialValues"></param>
 public void UpdateDisplayedInputValues(QuadDetectorBindingInputFeatureValues initialValues)
 {
     UIUseCenterPoint.IsChecked = initialValues.UseCenterPoint;
     if (initialValues.UseCenterPoint)
     {
         UpdateCenterPointDisplay(
             initialValues.CenterPointCoordinates.X,
             initialValues.CenterPointCoordinates.Y);
     }
     UILookupRegionCenterCropPercentage.Value = initialValues.SubMarginPercentage;
     UIMaxQuad.Value = initialValues.MaxDetectedQuads;
     UINumberOfPixelsPerEdge.Value = initialValues.NumberOfEdgePixels;
     UpdateBaseQuadCorners(initialValues.BaseQuad);
 }
        /// <summary>
        ///  QuadDetectorControl constructor
        /// </summary>
        /// <param name="binding"></param>
        public QuadDetectorControl(ISkillBinding binding) : base(binding)
        {
            // Update the view of the initial binding values
            m_quadDetectorBindingFeatureValues = ExtractBindingValues(binding);
            m_interactiveControl = new QuadDetectorSkillInteractiveControl();

            m_imageGrid.Children.Add(m_canvas);
            m_image.SetValue(Canvas.ZIndexProperty, -1);
            m_image.SizeChanged += Image_SizeChanged;

            // Add SubRectangleMargin control
            foreach (var margin in m_margins)
            {
                m_canvas.Children.Add(margin);
            }
            m_interactiveControl.SubMargingValueChanged            += QuadDetectorSkillInteractiveControl_SubMargingValueChanged;
            m_interactiveControl.MaxQuadValueChanged               += QuadDetectorSkillInteractiveControl_MaxQuadValueChanged;
            m_interactiveControl.NumberOfPixelsPerEdgeValueChanged += QuadDetectorSkillInteractiveControl_NumberOfPixelsPerEdgeValueChanged;

            // Add Quad results control
            m_quadsResultRenderer           = new QuadSetRenderer(ref m_canvas, 10);
            m_quadsResultRenderer.IsVisible = false;

            // Add BaseQuad control
            m_baseQuadRenderer                                    = new InteractiveQuadRenderer(ref m_canvas);
            m_baseQuadRenderer.IsVisible                          = false;
            m_baseQuadRenderer.CornersChanged                    += InteractiveQuadRenderer_CornersChanged;
            m_baseQuadRenderer.CornersChangeCompleted            += InteractiveQuadRenderer_CornersChangeCompleted;
            m_interactiveControl.SpecifyBaseQuadCheckedUnchecked += QuadDetectorSkillInteractiveControl_SpecifyBaseQuadCheckedUnchecked;

            // Add CenterPoint control
            m_centerPointControl.ManipulationDelta     += QuadRendererCenterPoint_ManipulationDelta;
            m_centerPointControl.ManipulationCompleted += QuadRendererCenterPoint_ManipulationCompleted;
            Mouse.SetCursor(m_centerPointControl, Windows.UI.Core.CoreCursorType.Pin);
            m_canvas.Children.Add(m_centerPointControl);
            m_interactiveControl.CenterPointCheckedUnchecked += QuadDetectorSkillInteractiveControl_CenterPointCheckedUnchecked;

            Children.Add(m_interactiveControl);
            m_interactiveControl.UpdateDisplayedInputValues(m_quadDetectorBindingFeatureValues);
        }