Wpf 如何动态加载用户控件?

Wpf 如何动态加载用户控件?,wpf,user-controls,code-behind,Wpf,User Controls,Code Behind,如何在窗口中动态加载用户控件(在运行时使用代码)?我强烈建议您看看,因为复合用户界面就是它的用途。然而,因为这需要重构整个应用程序,所以我也将直接回答您的问题 <UserControl x:Class="ViewA"> ... <UserControl/> <UserControl x:Class="ViewB"> ... <UserControl/> 如果要在容器中使用单用户控件,请在XAML中放置ContentControl,然后设

如何在窗口中动态加载用户控件(在运行时使用代码)?

我强烈建议您看看,因为复合用户界面就是它的用途。然而,因为这需要重构整个应用程序,所以我也将直接回答您的问题

<UserControl x:Class="ViewA">
  ...
<UserControl/>

<UserControl x:Class="ViewB">
  ...
<UserControl/>
如果要在容器中使用单用户控件,请在XAML中放置ContentControl,然后设置Content属性。如果使用的是视图模型,则可以将内容绑定到视图模型上的FrameworkElement属性:

contentControlInstance.Content = new CustomUserControl();
<UserControl x:Class="ViewA">
  ...
<UserControl/>

<UserControl x:Class="ViewB">
  ...
<UserControl/>
如果希望列表中有多个控件,请使用ItemsControl并将ObservableCollection分配给ItemsSource属性。如果使用的是视图模型,则可以将ItemsSource绑定到视图模型上的ObservableCollection属性

<UserControl x:Class="ViewA">
  ...
<UserControl/>

<UserControl x:Class="ViewB">
  ...
<UserControl/>
然后,您可以从该ObservableCollection添加/删除视图:

private ObservableCollection<FrameworkElement> views = 
    new ObservableCollection<FrameworkElement>();

private void Initialize()
{
    itemsControl.ItemsSource = views;
}

private void AddView(FrameworkElement frameworkElement)
{
    views.Add(frameworkElement);
}
<UserControl x:Class="ViewA">
  ...
<UserControl/>

<UserControl x:Class="ViewB">
  ...
<UserControl/>
私有ObservableCollection视图=
新的可观察集合();
私有void初始化()
{
itemsControl.ItemsSource=视图;
}
私有void AddView(FrameworkElement FrameworkElement)
{
添加(框架元素);
}

用于添加您需要的多个控件

<UserControl x:Class="ViewA">
  ...
<UserControl/>

<UserControl x:Class="ViewB">
  ...
<UserControl/>
假设您有一个StackPanel容器“myStack”

<UserControl x:Class="ViewA">
  ...
<UserControl/>

<UserControl x:Class="ViewB">
  ...
<UserControl/>

或者使用绑定。下面是一个非常粗糙的示例,展示了如何在单个WPF窗口中使用ContentControl和binding显示不同的WPF控件(这是像Prism或Caliburn Micro这样的工具包所做的)

<UserControl x:Class="ViewA">
  ...
<UserControl/>

<UserControl x:Class="ViewB">
  ...
<UserControl/>
XAML:

<UserControl x:Class="ViewA">
  ...
<UserControl/>

<UserControl x:Class="ViewB">
  ...
<UserControl/>