private void AddToGrid(Controls.LayerFrame frame, bool canResize)
        {
            Grid.Children.Add(frame);

            Panel.SetZIndex(frame, 0);

            var layer   = AdornerLayer.GetAdornerLayer(frame);
            var adorner = new OverlayPositionAdorner(frame, canResize);

            layer.Add(adorner);

            adorner.PositionUpdated += frame.RaisePositionChanged;
        }
        private Controls.LayerFrame Generate(PositionedOverlaySettings settings, string text, Color backgroundColor)
        {
            var control = new Controls.LayerFrame
            {
                Border =
                {
                    Background = new SolidColorBrush(backgroundColor)
                },
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Label =
                {
                    Content    = text,
                    Foreground = new SolidColorBrush(Colors.White)
                }
            };

            void Update()
            {
                int left = 0, top = 0, right = 0, bottom = 0;

                switch (settings.HorizontalAlignment)
                {
                case Alignment.Start:
                    control.HorizontalAlignment = HorizontalAlignment.Left;
                    left = settings.X;
                    break;

                case Alignment.Center:
                    control.HorizontalAlignment = HorizontalAlignment.Center;
                    left = settings.X;
                    break;

                case Alignment.End:
                    control.HorizontalAlignment = HorizontalAlignment.Right;
                    right = settings.X;
                    break;
                }

                switch (settings.VerticalAlignment)
                {
                case Alignment.Start:
                    control.VerticalAlignment = VerticalAlignment.Top;
                    top = settings.Y;
                    break;

                case Alignment.Center:
                    control.VerticalAlignment = VerticalAlignment.Center;
                    top = settings.Y;
                    break;

                case Alignment.End:
                    control.VerticalAlignment = VerticalAlignment.Bottom;
                    bottom = settings.Y;
                    break;
                }

                Dispatcher.Invoke(() => control.Margin = new Thickness(left, top, right, bottom));
            }

            settings.PropertyChanged += (s, e) => Update();

            Update();

            control.PositionUpdated += rect =>
            {
                settings.X = (int)rect.X;
                settings.Y = (int)rect.Y;
            };

            return(control);
        }