WPF:如何动态加载用户控件?

Muh*_*nan 15 wpf user-controls

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

Ric*_*lay 25

我强烈建议您查看Prism,因为复合用户界面就是它的用途.但是,由于这需要您重构整个应用程序,我还会直接回答您的问题.

如果要在容器中使用单个用户控件,请将ContentControl放入XAML中,然后设置Content属性.如果您使用的是视图模型,则可以将Content绑定到视图模型上的FrameworkElement属性:

contentControlInstance.Content = new CustomUserControl();
Run Code Online (Sandbox Code Playgroud)

如果要在列表中使用多个控件,请使用ItemsControl并将Items ObsableCollection <>分配给ItemsSource属性.如果您使用的是视图模型,则可以将ItemsSource绑定到View Model上的ObservableCollection属性.

然后你可以添加/删除ObservableCollection中的视图:

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

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

private void AddView(FrameworkElement frameworkElement)
{
    views.Add(frameworkElement);
}
Run Code Online (Sandbox Code Playgroud)


Sas*_*.R. 5

要添加多个控件,您需要容器。

假设您有一个StackPanel容器“ myStack”

<Window ..>
    <StackPanel Name="MyStack" />
</Window>
Run Code Online (Sandbox Code Playgroud)

您可以动态创建控件并将其添加到容器中。见下面的代码

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);    
}
Run Code Online (Sandbox Code Playgroud)