2012-03-31 65 views
0

我需要具有這些特徵的控制:如何使,如自定義控制網格的這些要求

  1. 應該可以使用它在XAML來設計。
  2. 它應該能夠保存單個類型的多個子元素。例如說Button
  3. 這些子元素將具有固定的尺寸。控件必須確定可以完全垂直和水平顯示的最大兒童數量(不能部分顯示任何兒童)。只顯示這些孩子,但保留不可見的孩子以備後用。 - 我想我可以通過Grid完成這項要求。
  4. 應該可以爲這些子元素設置動畫 - 我想這不是問題。

我試圖寫一個自定義控件來做到這一點。我從Grid繼承,並看到Grid implements IAddChild我認爲如果我覆蓋AddChild,我可以捕獲添加的元素。但是現在我發現Grid中的AddChild也沒有實現!所以看來我不能這樣做。我應該從哪裏開始?

編輯:感謝艾倫的三分球,我得到它的工作...

public class AutoLayoutingPanel : Panel 
{ 
    protected override Size MeasureOverride(Size availableSize) 
    { 
     Size size = new Size(); 
     size.Height = double.MaxValue; 
     size.Width = double.MaxValue; 

     foreach (UIElement child in Children) 
     { 
      child.Measure(size); 
      size.Height += child.DesiredSize.Height; 
      size.Width += child.DesiredSize.Width; 
     } 

     return availableSize; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     ArrangeGrid(finalSize); 
     return finalSize; 
    } 

    private void ArrangeGrid(Size finalSize) 
    { 
     foreach (UIElement child in Children) 
     { 
      child.Visibility = Visibility.Hidden; 
     } 

     Size maxCellSize = new Size(); 

     foreach (UIElement child in Children) 
     { 
      maxCellSize.Height = Math.Max(child.DesiredSize.Height, maxCellSize.Height); 
      maxCellSize.Width = Math.Max(child.DesiredSize.Width, maxCellSize.Width); 
     } 

     int rowCount = (int)Math.Floor(finalSize.Height/maxCellSize.Height); 
     int colCount = (int)Math.Floor(finalSize.Width/maxCellSize.Width); 

     int row = 0, col = 0; 
     foreach (UIElement child in Children) 
     { 
      if (row < rowCount && col < colCount) 
      { 
       Rect pos = new Rect(col * maxCellSize.Width, row * maxCellSize.Height, maxCellSize.Width, maxCellSize.Height); 
       child.Visibility = System.Windows.Visibility.Visible; 
       child.Arrange(pos); 
      } 
      else 
      { 
       break; 
      } 

      if (++row >= rowCount) 
      { 
       row = 0; 
       ++col; 
      } 
     } 
    } 
} 

回答

1

我認爲你需要創建的,而不是試圖從Grid繼承(關於IAddChild界面自定義佈局面板,它是使用EIMI實現的,因此從外部看不到也不可覆蓋)。 Here是一個很好的起點。

(另外,你需要考慮一下你要如何限制孩子的類型控件,您的控件可以持有。使用泛型將是一種選擇,但我對XAML泛型支持的疑慮。)