コード例 #1
0
 private void CreateSplitters()
 {
     for (int iChild = 1; iChild < Children.Count; iChild++)
     {
         var splitter = new LayoutGridResizerControl
         {
             Cursor = Orientation == Orientation.Horizontal ? Cursors.SizeWE : Cursors.SizeNS
         };
         Children.Insert(iChild, splitter);
         iChild++;
     }
 }
コード例 #2
0
        private void ShowResizerOverlayWindow(LayoutGridResizerControl splitter)
        {
            _resizerGhost = new Border()
            {
                Background = splitter.BackgroundWhileDragging,
                Opacity    = splitter.OpacityWhileDragging
            };

            var areaElement = _manager.GetAutoHideAreaElement();

            _internalHost.TransformActualSizeToAncestor();

            Point ptTopLeftScreen = areaElement.PointToScreenDpiWithoutFlowDirection(new Point());

            var managerSize = areaElement.TransformActualSizeToAncestor();

            Size windowSize;

            if (_side == AnchorSide.Right || _side == AnchorSide.Left)
            {
                windowSize = new Size(
                    managerSize.Width - 25.0 + splitter.ActualWidth,
                    managerSize.Height);

                _resizerGhost.Width  = splitter.ActualWidth;
                _resizerGhost.Height = windowSize.Height;
                ptTopLeftScreen.Offset(25, 0.0);
            }
            else
            {
                windowSize = new Size(
                    managerSize.Width,
                    managerSize.Height - _model.AutoHideMinHeight - 25.0 + splitter.ActualHeight);

                _resizerGhost.Height = splitter.ActualHeight;
                _resizerGhost.Width  = windowSize.Width;
                ptTopLeftScreen.Offset(0.0, 25.0);
            }

            _initialStartPoint = splitter.PointToScreenDpiWithoutFlowDirection(new Point()) - ptTopLeftScreen;

            if (_side == AnchorSide.Right || _side == AnchorSide.Left)
            {
                Canvas.SetLeft(_resizerGhost, _initialStartPoint.X);
            }
            else
            {
                Canvas.SetTop(_resizerGhost, _initialStartPoint.Y);
            }

            Canvas panelHostResizer = new Canvas()
            {
                HorizontalAlignment = HorizontalAlignment.Stretch,
                VerticalAlignment   = VerticalAlignment.Stretch
            };

            panelHostResizer.Children.Add(_resizerGhost);


            _resizerWindowHost = new Window()
            {
                ResizeMode         = ResizeMode.NoResize,
                WindowStyle        = WindowStyle.None,
                ShowInTaskbar      = false,
                AllowsTransparency = true,
                Background         = null,
                Width         = windowSize.Width,
                Height        = windowSize.Height,
                Left          = ptTopLeftScreen.X,
                Top           = ptTopLeftScreen.Y,
                ShowActivated = false,
                Owner         = Window.GetWindow(this),
                Content       = panelHostResizer
            };

            _resizerWindowHost.Show();
        }
コード例 #3
0
        private void CreateInternalGrid()
        {
            _internalGrid = new Grid {
                FlowDirection = FlowDirection.LeftToRight
            };
            _internalGrid.SetBinding(Panel.BackgroundProperty, new Binding("Background")
            {
                Source = this
            });


            _internalHost = new LayoutAnchorableControl {
                Model = _model, Style = AnchorableStyle
            };
            _internalHost.SetBinding(FlowDirectionProperty, new Binding("Model.Root.Manager.FlowDirection")
            {
                Source = this
            });

            KeyboardNavigation.SetTabNavigation(_internalGrid, KeyboardNavigationMode.Cycle);

            _resizer = new LayoutGridResizerControl();

            _resizer.DragStarted   += OnResizerDragStarted;
            _resizer.DragDelta     += OnResizerDragDelta;
            _resizer.DragCompleted += OnResizerDragCompleted;

            if (_side == AnchorSide.Right)
            {
                _internalGrid.ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = new GridLength(_manager.GridSplitterWidth)
                });
                _internalGrid.ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width =
                        _model.AutoHideWidth == 0.0
                                                        ? new GridLength(_model.AutoHideMinWidth)
                                                        : new GridLength(_model.AutoHideWidth, GridUnitType.Pixel)
                });

                Grid.SetColumn(_resizer, 0);
                Grid.SetColumn(_internalHost, 1);

                _resizer.Cursor = Cursors.SizeWE;

                HorizontalAlignment = HorizontalAlignment.Right;
                VerticalAlignment   = VerticalAlignment.Stretch;
            }
            else if (_side == AnchorSide.Left)
            {
                _internalGrid.ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width =
                        _model.AutoHideWidth == 0.0
                                                        ? new GridLength(_model.AutoHideMinWidth)
                                                        : new GridLength(_model.AutoHideWidth, GridUnitType.Pixel),
                });
                _internalGrid.ColumnDefinitions.Add(new ColumnDefinition()
                {
                    Width = new GridLength(_manager.GridSplitterWidth)
                });

                Grid.SetColumn(_internalHost, 0);
                Grid.SetColumn(_resizer, 1);

                _resizer.Cursor = Cursors.SizeWE;

                HorizontalAlignment = HorizontalAlignment.Left;
                VerticalAlignment   = VerticalAlignment.Stretch;
            }
            else if (_side == AnchorSide.Top)
            {
                _internalGrid.RowDefinitions.Add(new RowDefinition()
                {
                    Height =
                        _model.AutoHideHeight == 0.0
                                                        ? new GridLength(_model.AutoHideMinHeight)
                                                        : new GridLength(_model.AutoHideHeight, GridUnitType.Pixel),
                });
                _internalGrid.RowDefinitions.Add(new RowDefinition()
                {
                    Height = new GridLength(_manager.GridSplitterHeight)
                });

                Grid.SetRow(_internalHost, 0);
                Grid.SetRow(_resizer, 1);

                _resizer.Cursor = Cursors.SizeNS;

                VerticalAlignment   = VerticalAlignment.Top;
                HorizontalAlignment = HorizontalAlignment.Stretch;
            }
            else if (_side == AnchorSide.Bottom)
            {
                _internalGrid.RowDefinitions.Add(new RowDefinition()
                {
                    Height = new GridLength(_manager.GridSplitterHeight)
                });
                _internalGrid.RowDefinitions.Add(new RowDefinition()
                {
                    Height =
                        _model.AutoHideHeight == 0.0
                                                        ? new GridLength(_model.AutoHideMinHeight)
                                                        : new GridLength(_model.AutoHideHeight, GridUnitType.Pixel),
                });

                Grid.SetRow(_resizer, 0);
                Grid.SetRow(_internalHost, 1);

                _resizer.Cursor = Cursors.SizeNS;

                VerticalAlignment   = VerticalAlignment.Bottom;
                HorizontalAlignment = HorizontalAlignment.Stretch;
            }


            _internalGrid.Children.Add(_resizer);
            _internalGrid.Children.Add(_internalHost);
            _internalHostPresenter.Content = _internalGrid;
        }
コード例 #4
0
        private void ShowResizerOverlayWindow(LayoutGridResizerControl splitter)
        {
            _resizerGhost = new Border()
            {
                Background = splitter.BackgroundWhileDragging,
                Opacity    = splitter.OpacityWhileDragging
            };

            int indexOfResizer = InternalChildren.IndexOf(splitter);

            var prevChild = InternalChildren[indexOfResizer - 1] as FrameworkElement;
            var nextChild = GetNextVisibleChild(indexOfResizer);

            var prevChildActualSize = prevChild.TransformActualSizeToAncestor();
            var nextChildActualSize = nextChild.TransformActualSizeToAncestor();

            var layoutControl = prevChild as ILayoutControl;

            if (layoutControl != null)
            {
                var prevChildModel = (ILayoutPositionableElement)layoutControl.Model;
                var control        = nextChild as ILayoutControl;
                if (control != null)
                {
                    var nextChildModel = (ILayoutPositionableElement)control.Model;

                    Point ptTopLeftScreen = prevChild.PointToScreenDpiWithoutFlowDirection(new Point());

                    Size actualSize;

                    if (Orientation == Orientation.Horizontal)
                    {
                        actualSize = new Size(
                            prevChildActualSize.Width - prevChildModel.DockMinWidth + splitter.ActualWidth + nextChildActualSize.Width -
                            nextChildModel.DockMinWidth,
                            nextChildActualSize.Height);

                        _resizerGhost.Width  = splitter.ActualWidth;
                        _resizerGhost.Height = actualSize.Height;
                        ptTopLeftScreen.Offset(prevChildModel.DockMinWidth, 0.0);
                    }
                    else
                    {
                        actualSize = new Size(
                            prevChildActualSize.Width,
                            prevChildActualSize.Height - prevChildModel.DockMinHeight + splitter.ActualHeight + nextChildActualSize.Height -
                            nextChildModel.DockMinHeight);

                        _resizerGhost.Height = splitter.ActualHeight;
                        _resizerGhost.Width  = actualSize.Width;

                        ptTopLeftScreen.Offset(0.0, prevChildModel.DockMinHeight);
                    }

                    _initialStartPoint = splitter.PointToScreenDpiWithoutFlowDirection(new Point()) - ptTopLeftScreen;

                    if (Orientation == Orientation.Horizontal)
                    {
                        Canvas.SetLeft(_resizerGhost, _initialStartPoint.X);
                    }
                    else
                    {
                        Canvas.SetTop(_resizerGhost, _initialStartPoint.Y);
                    }

                    Canvas panelHostResizer = new Canvas()
                    {
                        HorizontalAlignment = HorizontalAlignment.Stretch,
                        VerticalAlignment   = VerticalAlignment.Stretch
                    };

                    panelHostResizer.Children.Add(_resizerGhost);


                    _resizerWindowHost = new Window()
                    {
                        SizeToContent      = SizeToContent.Manual,
                        ResizeMode         = ResizeMode.NoResize,
                        WindowStyle        = WindowStyle.None,
                        ShowInTaskbar      = false,
                        AllowsTransparency = true,
                        Background         = null,
                        Width         = actualSize.Width,
                        Height        = actualSize.Height,
                        Left          = ptTopLeftScreen.X,
                        Top           = ptTopLeftScreen.Y,
                        ShowActivated = false,
                        //Owner = Window.GetWindow(this),
                        Content = panelHostResizer
                    };
                }
            }
            _resizerWindowHost.Loaded += (s, e) => { _resizerWindowHost.SetParentToMainWindowOf(this); };
            _resizerWindowHost.Show();
        }
コード例 #5
0
        private void OnSplitterDragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
        {
            LayoutGridResizerControl splitter = sender as LayoutGridResizerControl;
            var rootVisual = this.FindVisualTreeRoot() as Visual;

            if (rootVisual != null)
            {
                var    trToWnd          = TransformToAncestor(rootVisual);
                Vector transformedDelta = trToWnd.Transform(new Point(e.HorizontalChange, e.VerticalChange)) -
                                          trToWnd.Transform(new Point());
            }

            double delta;

            if (Orientation == Orientation.Horizontal)
            {
                delta = Canvas.GetLeft(_resizerGhost) - _initialStartPoint.X;
            }
            else
            {
                delta = Canvas.GetTop(_resizerGhost) - _initialStartPoint.Y;
            }

            int indexOfResizer = InternalChildren.IndexOf(splitter);

            var prevChild = InternalChildren[indexOfResizer - 1] as FrameworkElement;
            var nextChild = GetNextVisibleChild(indexOfResizer);

            var prevChildActualSize = prevChild.TransformActualSizeToAncestor();
            var nextChildActualSize = nextChild.TransformActualSizeToAncestor();

            var layoutControl = (ILayoutControl)prevChild;

            if (layoutControl != null)
            {
                var prevChildModel = (ILayoutPositionableElement)layoutControl.Model;
                var control        = nextChild as ILayoutControl;
                if (control != null)
                {
                    var nextChildModel = (ILayoutPositionableElement)control.Model;

                    if (Orientation == Orientation.Horizontal)
                    {
                        //Trace.WriteLine(string.Format("PrevChild From {0}", prevChildModel.DockWidth));
                        prevChildModel.DockWidth = prevChildModel.DockWidth.IsStar
                                                        ? new GridLength(
                            prevChildModel.DockWidth.Value * (prevChildActualSize.Width + delta) / prevChildActualSize.Width,
                            GridUnitType.Star)
                                                        : new GridLength(prevChildModel.DockWidth.Value + delta, GridUnitType.Pixel);
                        //Trace.WriteLine(string.Format("PrevChild To {0}", prevChildModel.DockWidth));

                        //Trace.WriteLine(string.Format("NextChild From {0}", nextChildModel.DockWidth));
                        nextChildModel.DockWidth = nextChildModel.DockWidth.IsStar
                                                        ? new GridLength(
                            nextChildModel.DockWidth.Value * (nextChildActualSize.Width - delta) / nextChildActualSize.Width,
                            GridUnitType.Star)
                                                        : new GridLength(nextChildModel.DockWidth.Value - delta, GridUnitType.Pixel);
                        //Trace.WriteLine(string.Format("NextChild To {0}", nextChildModel.DockWidth));
                    }
                    else
                    {
                        //Trace.WriteLine(string.Format("PrevChild From {0}", prevChildModel.DockHeight));
                        prevChildModel.DockHeight = prevChildModel.DockHeight.IsStar
                                                        ? new GridLength(
                            prevChildModel.DockHeight.Value * (prevChildActualSize.Height + delta) / prevChildActualSize.Height,
                            GridUnitType.Star)
                                                        : new GridLength(prevChildModel.DockHeight.Value + delta, GridUnitType.Pixel);
                        //Trace.WriteLine(string.Format("PrevChild To {0}", prevChildModel.DockHeight));

                        //Trace.WriteLine(string.Format("NextChild From {0}", nextChildModel.DockHeight));
                        nextChildModel.DockHeight = nextChildModel.DockHeight.IsStar
                                                        ? new GridLength(
                            nextChildModel.DockHeight.Value * (nextChildActualSize.Height - delta) / nextChildActualSize.Height,
                            GridUnitType.Star)
                                                        : new GridLength(nextChildModel.DockHeight.Value - delta, GridUnitType.Pixel);
                        //Trace.WriteLine(string.Format("NextChild To {0}", nextChildModel.DockHeight));
                    }
                }
            }

            HideResizerOverlayWindow();
        }