2009-03-04 50 views
0

我有一個6行6列的網格控件。Silverlight中的交換控件

在第一行中,我有一個可以有兩種狀態的下拉菜單。 (新建或使用)

當我處於新狀態時,我有兩個控件。第3行第1列和第5列第1列紅色控件中的黃色控件

當我處於使用狀態時,我想交換控件的位置,以便紅色控件佔用第3行,第1列和黃色控件佔用第5行,第1列。

這在Silverlight中可能嗎?

回答

1

你真正想要的是WPF觸發器。不幸的是,Silverlight不支持觸發器,所以這不適合你。

您可以嘗試VisualStateManager類。當然,它的主要目的是維持控制的視覺狀態之間的轉換,因此它使用故事板並完成屬性的任意化;因此,它可能不適用於Grid.Column屬性。

蒂姆豪雅有一個短的introduction of VSM。這是關於shortcomings of VSM的意見。

你也可以建立你custom state manager on top of the VSM,它可以給你狀態管理沒有動畫過渡,也可能支持VSM類不支持的屬性。

或者當狀態發生改變時(您應該知道何時發生這種情況)並且明確更改兩個控件的Grid.Column屬性時,您可以調用自己的方法。主要缺點是您的代碼現在對視覺表示和佈局及其與狀態的關係有了明確的瞭解。

0

爲此,您可以使用SetValue方法。

你可以做到這一點的下拉的事件處理程序如下:

 

      _rowPanel1 = 2; 
      _rowPanel2 = 1; 
      panel1.SetValue(Grid.RowProperty, _rowPanel1); 
      panel2.SetValue(Grid.RowProperty, _rowPanel2); 

面板上的進一步深入,你可以綁定Grid.RowProperty(和/或列),以 實現INotifyPropertyChanged的類的clr屬性。

0

實際上,網格類包含這樣的方法:

Grid.SetRow(控件名稱,row_position); Grid.SetColumn(controlName,col_position); Grid.SetColumnSpan(controName,integer);

我可以使用它來交換我的控件。

這工作正常,因爲我只有一個網格在我的控制,但是,我不認爲這將工作,如果我的控制有多個網格。

0

將網格添加到需要動態內容的單元格。添加一個方法來處理下拉選擇的項目更改事件。當它改變,動態地明確然後設置網格的內容在其各自的細胞像這樣:

myContainerGrid.Children.Clear(); 
myContainerGrid.Children.Add(myNewControl); 

如果該含量更復雜,可以包裝每個成一個單獨的用戶的控制和動態地將其加載到集裝箱網格。

- 馬特