コード例 #1
0
ファイル: ChartDockPanel.cs プロジェクト: Mohsens22/OpenPasat
        protected override Size ArrangeOverride(Size finalSize)
        {
            m_resultDockRect = ChartLayoutUtils.Subtractthickness(new Rect(new Point(0, 0), finalSize), m_controlsThickness);
            Rect currRect = new Rect(new Point(0, 0), finalSize);
            Rect resRect  = currRect;

            #region Arrange Central Element
            if (m_rootElement != null)
            {
                try
                {
                    m_rootElement.Arrange(m_resultDockRect);
                }
                catch (Exception)
                {
                }
            }
            #endregion

            #region Arrange All Elements

            double legendTop = -1d;

            for (int i = 0; i < Children.Count; i++)
            {
                FrameworkElement element  = Children[i] as FrameworkElement;
                Size             elemSize = ChartLayoutUtils.Addthickness(element.DesiredSize, ElementMargin);
                double           scale;
                if (element != null && element != m_rootElement)
                {
                    var chartLegend = element as ChartLegend;
                    var offsetX     = 0d;
                    var offsetY     = 0d;
                    if (chartLegend != null)
                    {
                        offsetX = double.IsNaN(chartLegend.OffsetX) ? 0d : chartLegend.OffsetX;
                        offsetY = double.IsNaN(chartLegend.OffsetY) ? 0d : chartLegend.OffsetY;
                    }

                    #region Orientation == Orientation.Horizontal
                    switch (GetDock(element))
                    {
                    case ChartDock.Left:
                        if (element is ChartLegend)
                        {
                            var arrangeRect = (element as ChartLegend).ArrangeRect;
                            ArrangeElement(element, ChartDock.Left, new Rect(arrangeRect.Left + offsetX + currRect.Left, arrangeRect.Top + offsetY + m_controlsThickness.Top, arrangeRect.Width, arrangeRect.Height));
                        }
                        else
                        {
                            ArrangeElement(element, ChartDock.Left, new Rect(currRect.Left, resRect.Y, elemSize.Width, resRect.Height));
                            currRect.X    += elemSize.Width;
                            scale          = currRect.Width - elemSize.Width;
                            currRect.Width = scale > 0 ? scale : 0;
                        }
                        break;

                    case ChartDock.Right:
                        if (element is ChartLegend)
                        {
                            var arrangeRect = (element as ChartLegend).ArrangeRect;
                            ArrangeElement(element, ChartDock.Right, new Rect(arrangeRect.Left + offsetX + m_controlsThickness.Left, arrangeRect.Top + offsetY + m_controlsThickness.Top, arrangeRect.Width, arrangeRect.Height));
                        }
                        else
                        {
                            scale          = currRect.Width - elemSize.Width;
                            currRect.Width = scale > 0 ? scale : 0;
                            ArrangeElement(element, ChartDock.Right, new Rect(currRect.Right, resRect.Top + m_controlsThickness.Top, elemSize.Width, resRect.Height));
                        }
                        break;

                    case ChartDock.Top:
                        if (element is ChartLegend)
                        {
                            if (legendTop == -1)
                            {
                                legendTop = currRect.Top;
                            }
                            var arrangeRect = (element as ChartLegend).ArrangeRect;
                            ArrangeElement(element, ChartDock.Top, new Rect(arrangeRect.Left + offsetX + m_controlsThickness.Left, arrangeRect.Top + offsetY + legendTop, arrangeRect.Width, arrangeRect.Height));
                        }
                        else
                        {
                            ArrangeElement(element, ChartDock.Top, new Rect(0, currRect.Top, finalSize.Width, elemSize.Height));
                            currRect.Y     += elemSize.Height;
                            scale           = currRect.Height - elemSize.Height;
                            currRect.Height = scale > 0 ? scale : 0;
                        }
                        break;

                    case ChartDock.Bottom:
                        if (element is ChartLegend)
                        {
                            var arrangeRect = (element as ChartLegend).ArrangeRect;
                            ArrangeElement(element, ChartDock.Bottom, new Rect(arrangeRect.Left + offsetX + m_controlsThickness.Left, arrangeRect.Top + offsetY + m_controlsThickness.Top, arrangeRect.Width, arrangeRect.Height));
                        }
                        else
                        {
                            scale           = currRect.Height - elemSize.Height;
                            currRect.Height = scale > 0 ? scale : 0;
                            ArrangeElement(element, ChartDock.Bottom, new Rect(0, currRect.Bottom, finalSize.Width, elemSize.Height));
                        }
                        break;

                    case ChartDock.Floating:
                        Rect elementRect = new Rect(new Point(0, 0), new Size(element.DesiredSize.Width, element.DesiredSize.Height));
                        if (chartLegend != null)
                        {
                            element.Arrange(EnsureRectIsInside(resRect,
                                                               new Rect(chartLegend.ArrangeRect.Left + offsetX + m_controlsThickness.Left,
                                                                        chartLegend.ArrangeRect.Top + offsetY + m_controlsThickness.Top, element.DesiredSize.Width,
                                                                        chartLegend.DesiredSize.Height)));
                        }
                        else
                        {
                            element.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
                        }
                        break;
                    }
                    #endregion
                }
            }
            #endregion
#if Uno
#if __ANDROID__ || __IOS__ || __WASM__
            return(finalSize);
#else
            return(base.ArrangeOverride(finalSize));
#endif
#else
            return(base.ArrangeOverride(finalSize));
#endif
        }
コード例 #2
0
ファイル: ChartDockPanel.cs プロジェクト: Mohsens22/OpenPasat
        /// <summary>
        /// Provides the behavior for the Measure pass of Silverlight layout. Classes can override this method to define their own Measure pass behavior.
        /// </summary>
        /// <returns>
        /// The size that this object determines it needs during layout, based on its calculations of the allocated sizes for child objects; or based on other considerations, such as a fixed container size.
        /// </returns>
        /// <param name="availableSize">The Available Size</param>
        protected override Size MeasureOverride(Size availableSize)
        {
            var topSizes    = new List <double>();
            var leftSizes   = new List <double>();
            var bottomSizes = new List <double>();
            var rightSizes  = new List <double>();

            Thickness margin = this.ElementMargin;

            m_controlsThickness = this.ElementMargin;
            foreach (UIElement element in Children)
            {
                if (element == null)
                {
                    continue;
                }
                if (element == m_rootElement)
                {
                    continue;
                }
                element.Measure(availableSize);
                Size elemSize    = ChartLayoutUtils.Addthickness(element.DesiredSize, margin);
                var  chartLegend = element as ChartLegend;
                switch (GetDock(element))
                {
                case ChartDock.Left:
                    if (chartLegend != null)
                    {
                        var index = chartLegend.RowColumnIndex;
                        if (leftSizes.Count <= index)
                        {
                            leftSizes.Add(elemSize.Width);
                        }
                        else if (leftSizes[index] < elemSize.Width)
                        {
                            leftSizes[index] = elemSize.Width;
                        }
                    }
                    else
                    {
                        m_controlsThickness.Left += elemSize.Width;
                    }
                    break;

                case ChartDock.Right:
                    if (chartLegend != null)
                    {
                        var index = chartLegend.RowColumnIndex;
                        if (rightSizes.Count <= index)
                        {
                            rightSizes.Add(elemSize.Width);
                        }
                        else if (rightSizes[index] < elemSize.Width)
                        {
                            rightSizes[index] = elemSize.Width;
                        }
                    }
                    else
                    {
                        m_controlsThickness.Right += elemSize.Width;
                    }
                    break;

                case ChartDock.Top:
                    if (chartLegend != null)
                    {
                        var index = chartLegend.RowColumnIndex;
                        if (topSizes.Count <= index)
                        {
                            topSizes.Add(elemSize.Height);
                        }
                        else if (topSizes[index] < elemSize.Height)
                        {
                            topSizes[index] = elemSize.Height;
                        }
                    }
                    else
                    {
                        m_controlsThickness.Top += elemSize.Height;
                    }
                    break;

                case ChartDock.Bottom:
                    if (chartLegend != null)
                    {
                        var index = chartLegend.RowColumnIndex;
                        if (bottomSizes.Count <= index)
                        {
                            bottomSizes.Add(elemSize.Height);
                        }
                        else if (bottomSizes[index] < elemSize.Height)
                        {
                            bottomSizes[index] = elemSize.Height;
                        }
                    }
                    else
                    {
                        m_controlsThickness.Bottom += elemSize.Height;
                    }
                    break;

                case ChartDock.Floating:
                    // WPF - 33623 Force to measure the dockpanel when set the DockPosition and LegendPosition as Inside.
                    if (chartLegend != null)
                    {
                        if (chartLegend.ActualHeight > 0 ||
                            chartLegend.ActualWidth > 0)
                        {
                            leftSizes.Add(0);
                        }
                        else
                        {
                            leftSizes.Add(0.1);
                        }
                    }

                    break;
                }
            }

            m_controlsThickness.Left   += leftSizes.Sum();
            m_controlsThickness.Right  += rightSizes.Sum();
            m_controlsThickness.Top    += topSizes.Sum();
            m_controlsThickness.Bottom += bottomSizes.Sum();

            try
            {
                var areasize = ChartLayoutUtils.Subtractthickness(availableSize, m_controlsThickness);
                m_rootElement.Measure(areasize);
            }
            catch (Exception)
            {
            }
            return(availableSize);
        }