2011-04-22 74 views
1

我想設置佈局網格內的按鈕的屬性。網格本身是動態生成的,網格單元格內的按鈕也是動態生成的。不幸的是,我不能在代碼中使用任何名字。Silverlight佈局網格子控件

我需要引用基於他們在網格單元格的按鈕。我嘗試使用下面的代碼。

stackButton = (Button) (from buttons in rowGrid.Children 
          where Grid.GetColumn (buttons as FrameworkElement) == s.RoomCol 
          where Grid.GetRow (buttons as FrameworkElement) == s.RoomRow 
          select buttons).FirstOrDefault(); 

「stackButton」控件是一個Button控件。 「s」是一個自定義控件,用於保存網格中按鈕的座標。代碼執行時,我沒有收到任何返回的對象。任何想法如何我可以更好地執行此?

回答

1

簡短的回答:

並非沒有得到創造性的(見下文)。這基本上是唯一的方法,因爲附加屬性如何工作。

除了

但有兩件事情...在風格上,而不是兩個where子句,您可以使用& & 技術上可以有兩個控件共享同一行/列(在這種情況下,它們疊加,所以你可能要重新考慮「firstordefault」

完整的答案:YES

如果你想獲得超級聰明,你可以重新gister自己的附加依賴的屬性,如:Grid.MyRowGrid.MyColumn,給他們一個OnChanged處理程序,這將:

  • 設置標準Grid.SetRow(或列)
  • 您的控件添加到字典中,有一排鍵,柱。即:使自己的類,它具有和Column,實施EqualsGetHashCode,所以你可以這樣做:

    字典_buttons =新詞典();

    調用onChanged(DependencyObject的物鏡,DependencyPropertyChangedEventArgs E) { //剪斷 _dict.Add(新GridKey(行,列),按鈕); }

然後您查找變成O(1)操作而不是O(n)的

如果你不想去的附加屬性的路線,你可以簡單地做_dict.Add當你動態生成網格時。 (當你做rowGrid.Children.Add(..)

如果你不能做到這一點,那麼你可以有它遍歷孩子一次,他們都添加到字典的方法,以便進一步查找是O(1)

+0

這回答了你的問題了嗎? – Kir 2011-04-24 05:35:05