我有一个包含6行和6列的网格控件。
在第一行,我有一个可以有两种状态的下拉列表。 (新的或二手的)
当我处于New状态时,我有两个控件。第3行,第1列中的黄色控制和第5行第1行中的红色控制
当我处于使用状态时,我想交换控件的位置,以便红色控件占据第3行,第1列和黄色控件占据第5行第1行。
这可以在Silverlight中使用吗?
答案 0 :(得分:1)
你真正想要的是WPF触发器。不幸的是,Silverlight不支持触发器,因此不适合您。
您可以尝试VisualStateManager
课程。当然,它的主要目的是维持控件的视觉状态之间的过渡,因此它使用故事板并对属性进行任何确定;因此,它可能不适用于Grid.Column属性。
Tim Heuer有一个简短的introduction of VSM。以下是关于shortcomings of VSM的意见。
您还可以构建custom state manager on top of the VSM,它可以为您提供没有动画过渡的状态管理,也可以为VSM类不支持的属性提供支持。
或者您可以拥有自己的方法,在状态发生变化时调用(您应该知道何时发生)并显式更改两个控件上的Grid.Column属性。主要缺点是您的代码现在具有关于可视化表示和布局的明确知识以及它与状态的关联。
答案 1 :(得分:0)
为此,您可以使用 SetValue 方法。
您可以在下拉列表的事件处理程序上执行此操作,如下所示:
_rowPanel1 = 2;
_rowPanel2 = 1;
panel1.SetValue(Grid.RowProperty, _rowPanel1);
panel2.SetValue(Grid.RowProperty, _rowPanel2);
更进一步,您可以将面板上的Grid.RowProperty(和/或列)绑定到 实现INotifyPropertyChanged的类的clr属性。
答案 2 :(得分:0)
实际上,Grid类包含如下方法:
Grid.SetRow(controlName,row_position); Grid.SetColumn(controlName,col_position); Grid.SetColumnSpan(controName,integer);
我可以用来交换我的控件。
这样可行,因为我的控件中只有一个Grid,但是,如果我的控件有多个网格,我认为这不会起作用。
答案 3 :(得分:0)
将网格添加到需要动态内容的单元格中。添加一个方法来处理下拉列表选定的项目已更改事件。当它改变时,动态清除然后在各自的单元格中设置网格的内容,如下所示:
myContainerGrid.Children.Clear();
myContainerGrid.Children.Add(myNewControl);
如果内容更复杂,您可以将每个内容包装到一个单独的用户控件中,并将其动态加载到容器网格中。
- 亚光