private void OnUnhookPanel(UnhookPanelMessage msg)
        {
            if (_panel != null)
            {
                _hookers.Remove(msg.Hooker);

                if (object.ReferenceEquals(_activeHooker, msg.Hooker))
                {
                    msg.Hooker.UnhookPanel();

                    if (_hookers.Count > 0)
                    {
                        var h = _hookers.FirstOrDefault();

                        ChangeReference(_panel, msg.Hooker.TotalTransformation, h.TotalTransformation);
                        h.HookPanel(_panel);
                        _activeHooker                 = h;
                        _residualTransform            = _panel.Transform.Value.Inverse();
                        _residualTransformInitialized = true;
                    }
                    else
                    {
                        ChangeReference(_panel, msg.Hooker.TotalTransformation, _sourceTransformation);
                        Children.Add(_panel);
                        _sourceTransformation = null;
                        _activeHooker         = null;
                    }
                }
            }
        }
        private void OnHookPanel(HookPanelMessage msg)
        {
            if (_panel != null)
            {
                if (_sourceTransformation == null)
                {
                    _sourceTransformation = this.GetChainTansform().StaticClone();
                }


                if (_hookers.Count == 0)
                {
                    Children.Remove(_panel);
                    ChangeReference(_panel, _sourceTransformation, msg.Hooker.TotalTransformation);
                    msg.Hooker.HookPanel(_panel);
                    _activeHooker                 = msg.Hooker;
                    _residualTransform            = _panel.Transform.Value.Inverse();
                    _residualTransformInitialized = true;
                }

                _hookers.Add(msg.Hooker);
            }
        }