如何使用Expression Blend动态添加/删除控件?

时间:2012-01-18 21:26:13

标签: wpf silverlight expression-blend

我去的时候,我用Expression Blend制作了一个演示应用程序。

我的第一个屏幕是一个很大的按钮选择,所以当用户点击任何一个按钮时,它会转到MainView。

然后在MainView中,我有一个菜单项列表,用户可以单击它并显示其对应的DisplayView。 (约会菜单项将显示AppointmentView等。)

一切都很好,我可以点击MenuItem,视图会显示动画和过渡效果。

但问题是,通过在Expression Blend中创建MainView,Menu,AppointmentView等,XAML中预定义了所有内容。因此,当用户加载时,第一个屏幕必须将所有内容加载到内存中。

现在想一想,不应该将MainView等动态添加到屏幕上吗? 我如何使用Expression Blend做到这一点?或者唯一的方法就是....自己在代码隐藏中做这件事(为动态添加/删除控件编写StoryBoard等?)

如果有任何示例/教程,那就太棒了。

1 个答案:

答案 0 :(得分:0)

我猜你在没有编写代码隐藏的情况下,在Blend中有条件地加载或卸载控件的可能性非常有限。

通常,XAML中的开始标记等同于某个类对象的无参数构造函数。一旦你编写了标签,你就会实例化一个对象,但这并不意味着它的视觉外观被加载到内存中。这仅在控件实际显示在屏幕上时才会发生。

在我看来,控制某些控件外观的最简单方法是使用单子控件。以Border控件为例,将要有条件加载的用户控件添加到其子属性中,这样就可以决定是加载还是卸载控件。

但不幸的是,我认为你必须在代码中也这样做。拿这个简单的代码片段:

// either instantiate in code or use from markuup
Border myBorder = new Border();

// the control you want to conditionally appear and disappear
UserControl myUserControl = new UserControl();
myBorder.Child.Add(myUserControl);

当然,更复杂的方法是使用网格。在这里,您必须使用附加属性来添加或删除子元素:

// either instantiate in code or use from markuup
Grid myGrid = new Grid();

// the control you want to conditionally appear and disappear
UserControl myUserControl = new UserControl();

// set the target position inside the Grid via the Grids attached properties
Grid.setRow(myUserControl, 1);
Grid.setColumn(myUserControl, 0);

// actually add the control
Grid.Children.Add(myUserControl);

虽然我很确定你知道所有这些我希望它有所帮助:)