2009-03-04 48 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); 

如果该含量更复杂,可以包装每个成一个单独的用户的控制和动态地将其加载到集装箱网格。

- 马特