如何在窗口中动态加载用户控件(在运行时使用代码)?
我强烈建议您看看Prism,因为复合用户界面正是它的用途。但是,由于这将需要您重构整个应用程序,因此我也将直接回答您的问题。
如果要在容器中使用单个用户控件,请将ContentControl放在XAML中,然后设置Content属性。如果使用的是视图模型,则可以将Content绑定到视图模型上的FrameworkElement属性:
contentControlInstance.Content = new CustomUserControl();
如果要在列表中使用多个控件,请使用ItemsControl并将ObservableCollection <>分配给ItemsSource属性。如果使用的是视图模型,则可以将ItemsSource绑定到视图模型上的ObservableCollection属性。
然后您可以从该ObservableCollection中添加/删除视图:
private ObservableCollection<FrameworkElement> views =
new ObservableCollection<FrameworkElement>();
private void Initialize()
{
itemsControl.ItemsSource = views;
}
private void AddView(FrameworkElement frameworkElement)
{
views.Add(frameworkElement);
}
要添加多个控件,您需要容器。
假设您有一个StackPanel容器“ myStack”
<Window ..>
<StackPanel Name="MyStack" />
</Window>
您可以动态创建控件并将其添加到容器中。参见下面的代码
void AddButtons()
{
Button B1=new Button(),B2=new Button(), B3=new Button();
B1.Content="Hello";
B2.Content="First";
B3.content="Application";
// Now you can set more properties like height, width, margin etc...
MyStack.Children.Add(B1);
MyStack.Children.Add(B2);
MyStack.Children.Add(B2);
}
或使用绑定。这是一个非常粗糙的示例,显示了如何使用ContentControl和绑定在单个WPF窗口中显示不同的WPF控件(这是Prism或Caliburn Micro这样的工具箱的功能。)
XAML:
<UserControl x:Class="ViewA">
...
<UserControl/>
<UserControl x:Class="ViewB">
...
<UserControl/>
代码:
void ShowViewModelDialog (object viewModel)
{
var host = new MyViewHost();
FrameworkElement control = null;
string viewModelName = viewModel.GetType().Name;
switch (viewModelName )
{
case ("ViewModelA"):
control = new ViewA();
break;
case ("ViewModelB"):
control = new ViewB();
break;
default:
control = new TextBlock {Text = String.Format ("No view for {0}", viewModelName);
break;
}
if (control!=null) control.DataContext = viewModel;
host.DataContext = control;
host.Show(); // Host window will show either ViewA, ViewB, or TextBlock.
}