C# 在Silverlight中交换控件

C# 在Silverlight中交换控件,c#,silverlight,C#,Silverlight,我有一个6行6列的网格控件 在第一行,我有一个下拉列表,可以有两种状态。(新的或用过的) 当我处于新的状态时,我有两个控件。第3行第1列中的黄色对照和第5行第1列中的红色对照 当我处于已使用状态时,我想交换控件的位置,以便红色控件占据第3行第1列,黄色控件占据第5行第1列 这在Silverlight中可能吗?您真正想要的是WPF触发器。不幸的是,Silverlight中不支持触发器,因此这不是您的选项 你可以试试这门课。当然,它的主要目的是保持控制的视觉状态之间的转换,因此它使用故事板并对属性进

我有一个6行6列的网格控件

在第一行,我有一个下拉列表,可以有两种状态。(新的或用过的)

当我处于新的状态时,我有两个控件。第3行第1列中的黄色对照和第5行第1列中的红色对照

当我处于已使用状态时,我想交换控件的位置,以便红色控件占据第3行第1列,黄色控件占据第5行第1列


这在Silverlight中可能吗?

您真正想要的是WPF触发器。不幸的是,Silverlight中不支持触发器,因此这不是您的选项

你可以试试这门课。当然,它的主要目的是保持控制的视觉状态之间的转换,因此它使用故事板并对属性进行任何信息处理;因此,它可能不适用于Grid.Column属性

蒂姆·豪尔有一个短处。以下是对这个问题的看法

您还可以构建自己,这样可以在不设置动画转换的情况下提供状态管理,还可以潜在地支持VSM类不支持的属性

或者,您可以在状态更改时调用自己的方法(您应该知道何时发生),并显式更改两个控件上的Grid.Column属性。主要的缺点是,您的代码现在已经明确了解了可视化表示和布局,以及它如何与状态关联。

为此,您可以使用SetValue方法

您可以在下拉列表的事件处理程序上执行此操作,如下所示:


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

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

进一步,您可以将面板上的Grid.RowProperty(和/或列)绑定到
实现INotifyPropertyChanged的类的clr属性。

实际上,Grid类包含以下方法:

Grid.SetRow(控件名称、行位置); Grid.SetColumn(控件名称、列位置); Grid.SetColumnSpan(控件名,整数)

我可以用它来交换我的控件


这可以,因为我的控件中只有一个网格,但是,如果我的控件有多个网格,我认为这不起作用。

将网格添加到需要动态内容的单元格中。添加一个方法来处理下拉选择项更改事件。更改时,动态清除网格,然后在其各自的单元格中设置网格的内容,如下所示:

myContainerGrid.Children.Clear();
myContainerGrid.Children.Add(myNewControl);
如果内容更复杂,可以将每个内容包装到单独的用户控件中,并将其动态加载到容器网格中

--马特