2010-02-13 6 views
0

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

+0

Возможно, было бы яснее, если бы вывела достаточно короткий пример Xaml, а не пыталась объяснить это в предложении. – AnthonyWJones

ответ

0

Я предполагаю, что вы хотите разместить свой собственный контроль (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 для вас визуальный контейнер, и вы таможенного контроля.

+0

<Страница: MyCustomControl x: Name = "itemPanel" Tag = "{Binding}"> Это основная страница – jolly

+0

На самом деле я хочу установить желаемую ширину myCustomControl. Я пробовал метод measureOverride и ArrangeOverride, но все еще не работал. Элемент управления MyCustom содержит ContentControl, к которому я применяю разные стили в загруженном событии. Ниже приведена xaml для My customControl jolly

Смежные вопросы