예제 #1
0
        /// <summary>
        /// <see cref="PropertyMetadata.PropertyChangedCallback"/>
        /// </summary>
        /// <remarks>
        /// This method needs to be internal to be accessable from derived classes.
        /// </remarks>
        internal static void OnUserSizePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DefinitionBase definition = (DefinitionBase)d;

            if (definition.InParentLogicalTree)
            {
                if (definition._sharedState != null)
                {
                    definition._sharedState.Invalidate();
                }
                else
                {
                    Grid parentGrid = (Grid)definition.Parent;

                    if (((GridLength)e.OldValue).GridUnitType != ((GridLength)e.NewValue).GridUnitType)
                    {
                        parentGrid.Invalidate();
                    }
                    else
                    {
                        parentGrid.InvalidateMeasure();
                    }
                }
            }
        }
예제 #2
0
        /// <summary>
        /// <see cref="PropertyMetadata.PropertyChangedCallback"/>
        /// </summary>
        /// <remarks>
        /// This method needs to be internal to be accessable from derived classes.
        /// </remarks>
        internal static void OnUserMaxSizePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DefinitionBase definition = (DefinitionBase)d;

            if (definition.InParentLogicalTree)
            {
                Grid parentGrid = (Grid)definition.Parent;
                parentGrid.InvalidateMeasure();
            }
        }
예제 #3
0
            /// <summary>
            /// OnLayoutUpdated handler. Validates that all participating definitions
            /// have updated min size value. Forces another layout update cycle if needed.
            /// </summary>
            private void OnLayoutUpdated(object sender, EventArgs e)
            {
                double sharedMinSize = 0;

                //  accumulate min size of all participating definitions
                for (int i = 0, count = _registry.Count; i < count; ++i)
                {
                    sharedMinSize = Math.Max(sharedMinSize, _registry[i].MinSize);
                }

                bool sharedMinSizeChanged = !DoubleUtil.AreClose(_minSize, sharedMinSize);

                //  compare accumulated min size with min sizes of the individual definitions
                for (int i = 0, count = _registry.Count; i < count; ++i)
                {
                    DefinitionBase definitionBase = _registry[i];

                    if (sharedMinSizeChanged || definitionBase.LayoutWasUpdated)
                    {
                        //  if definition's min size is different, then need to re-measure
                        if (!DoubleUtil.AreClose(sharedMinSize, definitionBase.MinSize))
                        {
                            Grid parentGrid = (Grid)definitionBase.Parent;
                            parentGrid.InvalidateMeasure();
                            definitionBase.UseSharedMinimum = true;
                        }
                        else
                        {
                            definitionBase.UseSharedMinimum = false;

                            //  if measure is valid then also need to check arrange.
                            //  Note: definitionBase.SizeCache is volatile but at this point
                            //  it contains up-to-date final size
                            if (!DoubleUtil.AreClose(sharedMinSize, definitionBase.SizeCache))
                            {
                                Grid parentGrid = (Grid)definitionBase.Parent;
                                parentGrid.InvalidateArrange();
                            }
                        }

                        definitionBase.LayoutWasUpdated = false;
                    }
                }

                _minSize = sharedMinSize;

                _layoutUpdatedHost.LayoutUpdated -= _layoutUpdated;
                _layoutUpdatedHost = null;

                _broadcastInvalidation = true;
            }
            // Token: 0x06008770 RID: 34672 RVA: 0x0024FBDC File Offset: 0x0024DDDC
            private void ValidateSharedSizeGroup()
            {
                double num   = 0.0;
                int    i     = 0;
                int    count = this._registry.Count;

                while (i < count)
                {
                    num = Math.Max(num, this._registry[i]._minSize);
                    i++;
                }
                bool flag   = !DoubleUtil.AreClose(this._minSize, num);
                int  j      = 0;
                int  count2 = this._registry.Count;

                while (j < count2)
                {
                    DefinitionBase definitionBase = this._registry[j];
                    bool           flag2          = !DoubleUtil.AreClose(definitionBase._minSize, num);
                    bool           flag3;
                    if (!definitionBase.UseSharedMinimum)
                    {
                        flag3 = !flag2;
                    }
                    else if (flag2)
                    {
                        flag3 = !flag;
                    }
                    else
                    {
                        flag3 = (definitionBase.LayoutWasUpdated && DoubleUtil.GreaterThanOrClose(definitionBase._minSize, this.MinSize));
                    }
                    if (!flag3)
                    {
                        Grid grid = (Grid)definitionBase.Parent;
                        grid.InvalidateMeasure();
                    }
                    else if (!DoubleUtil.AreClose(num, definitionBase.SizeCache))
                    {
                        Grid grid2 = (Grid)definitionBase.Parent;
                        grid2.InvalidateArrange();
                    }
                    definitionBase.UseSharedMinimum = flag2;
                    definitionBase.LayoutWasUpdated = false;
                    j++;
                }
                this._minSize = num;
                this._layoutUpdatedHost.LayoutUpdated -= this._layoutUpdated;
                this._layoutUpdatedHost     = null;
                this._broadcastInvalidation = true;
            }
            // Token: 0x06008771 RID: 34673 RVA: 0x0024FD2C File Offset: 0x0024DF2C
            private void ValidateSharedSizeGroupLegacy()
            {
                double num   = 0.0;
                int    i     = 0;
                int    count = this._registry.Count;

                while (i < count)
                {
                    num = Math.Max(num, this._registry[i].MinSize);
                    i++;
                }
                bool flag   = !DoubleUtil.AreClose(this._minSize, num);
                int  j      = 0;
                int  count2 = this._registry.Count;

                while (j < count2)
                {
                    DefinitionBase definitionBase = this._registry[j];
                    if (flag || definitionBase.LayoutWasUpdated)
                    {
                        if (!DoubleUtil.AreClose(num, definitionBase.MinSize))
                        {
                            Grid grid = (Grid)definitionBase.Parent;
                            grid.InvalidateMeasure();
                            definitionBase.UseSharedMinimum = true;
                        }
                        else
                        {
                            definitionBase.UseSharedMinimum = false;
                            if (!DoubleUtil.AreClose(num, definitionBase.SizeCache))
                            {
                                Grid grid2 = (Grid)definitionBase.Parent;
                                grid2.InvalidateArrange();
                            }
                        }
                        definitionBase.LayoutWasUpdated = false;
                    }
                    j++;
                }
                this._minSize = num;
                this._layoutUpdatedHost.LayoutUpdated -= this._layoutUpdated;
                this._layoutUpdatedHost     = null;
                this._broadcastInvalidation = true;
            }
예제 #6
0
            /// <summary>
            /// OnLayoutUpdated handler. Validates that all participating definitions
            /// have updated min size value. Forces another layout update cycle if needed.
            /// </summary>
            private void OnLayoutUpdated(object sender, EventArgs e)
            {
                double sharedMinSize = 0;

                //  accumulate min size of all participating definitions
                for (int i = 0, count = _registry.Count; i < count; ++i)
                {
                    sharedMinSize = Math.Max(sharedMinSize, _registry[i]._minSize);
                }

                bool sharedMinSizeChanged = !DoubleUtil.AreClose(_minSize, sharedMinSize);

                //  compare accumulated min size with min sizes of the individual definitions
                for (int i = 0, count = _registry.Count; i < count; ++i)
                {
                    DefinitionBase definitionBase = _registry[i];

                    // we'll set d.UseSharedMinimum to maintain the invariant:
                    //      d.UseSharedMinimum iff d._minSize < this.MinSize
                    // i.e. iff d is not a "long-pole" definition.
                    //
                    // Measure/Arrange of d's Grid uses d._minSize for long-pole
                    // definitions, and max(d._minSize, shared size) for
                    // short-pole definitions.  This distinction allows us to react
                    // to changes in "long-pole-ness" more efficiently and correctly,
                    // by avoiding remeasures when a long-pole definition changes.
                    bool useSharedMinimum = !DoubleUtil.AreClose(definitionBase._minSize, sharedMinSize);

                    // before doing that, determine whether d's Grid needs to be remeasured.
                    // It's important _not_ to remeasure if the last measure is still
                    // valid, otherwise infinite loops are possible
                    bool measureIsValid;
                    if (!definitionBase.UseSharedMinimum)
                    {
                        // d was a long-pole.  measure is valid iff it's still a long-pole,
                        // since previous measure didn't use shared size.
                        measureIsValid = !useSharedMinimum;
                    }
                    else if (useSharedMinimum)
                    {
                        // d was a short-pole, and still is.  measure is valid
                        // iff the shared size didn't change
                        measureIsValid = !sharedMinSizeChanged;
                    }
                    else
                    {
                        // d was a short-pole, but is now a long-pole.  This can
                        // happen in several ways:
                        //  a. d's minSize increased to or past the old shared size
                        //  b. other long-pole definitions decreased, leaving
                        //      d as the new winner
                        // In the former case, the measure is valid - it used
                        // d's new larger minSize.  In the latter case, the
                        // measure is invalid - it used the old shared size,
                        // which is larger than d's (possibly changed) minSize
                        measureIsValid = (definitionBase.LayoutWasUpdated &&
                                          DoubleUtil.GreaterThanOrClose(definitionBase._minSize, this.MinSize));
                    }

                    if (!measureIsValid)
                    {
                        Grid parentGrid = (Grid)definitionBase.Parent;
                        parentGrid.InvalidateMeasure();
                    }
                    else if (!DoubleUtil.AreClose(sharedMinSize, definitionBase.SizeCache))
                    {
                        //  if measure is valid then also need to check arrange.
                        //  Note: definitionBase.SizeCache is volatile but at this point
                        //  it contains up-to-date final size
                        Grid parentGrid = (Grid)definitionBase.Parent;
                        parentGrid.InvalidateArrange();
                    }

                    // now we can restore the invariant, and clear the layout flag
                    definitionBase.UseSharedMinimum = useSharedMinimum;
                    definitionBase.LayoutWasUpdated = false;
                }

                _minSize = sharedMinSize;

                _layoutUpdatedHost.LayoutUpdated -= _layoutUpdated;
                _layoutUpdatedHost = null;

                _broadcastInvalidation = true;
            }