Как настроить ширину элемента wrapPanels динамически? - PullRequest
0 голосов
/ 13 февраля 2010

Привет, у меня ItemsControl в моей основной сетке и PanelTemplate как wrapPanel. В этой обертке я ставлю MyCustomControl. Я хочу динамически устанавливать ширину MycustomControl. Также мне нужен доступ к этой ширине в событии onLoaded MyCustomControl. Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 13 февраля 2010

Я предполагаю, что вы хотите поместить свой пользовательский элемент управления (MyCustomControl) в визуальный контейнер (в данном случае WrapPanel).

Я обнаружил, что поиск свойств ActualWidth и ActualHeight в событии OnLoaded не работает, поскольку процесс макета в Silverlight еще не завершен.

В каждом визуальном контейнере реализован двухэтапный процесс, отвечающий за определение размера и организацию дочерних элементов управления.

В качестве примера приведем класс панели, реализующий только что упомянутый двухэтапный процесс (MeasureOverride () и ArrangeOverride ()).

public class RowPanel : Panel
    {
        private const double _groupSpace = 80;

        public Point Location;

        public RowPanel ()
            : base()
        {
            Location = new Point();
        }

        protected override Size MeasureOverride ( Size availableSize )
        {
            Size size = new Size( double.PositiveInfinity, double.PositiveInfinity );
            foreach ( UIElement child in Children )
                child.Measure( size );

            return this.ArrangeNodes( false );
        }

        protected override Size ArrangeOverride ( Size finalSize )
        {
            return this.ArrangeNodes( true );
        }

        private Size ArrangeNodes ( bool arrange )
        {
            double pos = 0d;
            Rect bounds = new Rect();
            Size totalSize = new Size( 0, 0 );

            foreach ( UIElement child in Children )
            {
                GroupPanel group = child as GroupPanel;

                bounds.X = pos;
                bounds.Y = 0;

                bounds.Width = group.DesiredSize.Width;
                bounds.Height = group.DesiredSize.Height;

                if ( arrange )
                {
                    group.Arrange( bounds );
                    Point b = new Point( bounds.X, bounds.Y );
                    group.SetValue( GroupPanel.LocationProperty, b );
                }

                totalSize.Width = pos + group.DesiredSize.Width;
                totalSize.Height = Math.Max( totalSize.Height, group.DesiredSize.Height );

                pos += ( bounds.Width + RowPanel._groupSpace );
            }

            return totalSize;
        }
    }

Я хотел бы предложить вам реализовать MeasureOverride и ArrangeOverride для визуального контейнера и пользовательского элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...