2009-11-21 29 views

Respuesta

21

Recomiendo echar un vistazo a Prism, ya que las interfaces de usuario compuestas son para lo que son. Sin embargo, dado que esto requeriría la refacturación de toda su aplicación, también responderé su pregunta directamente.

Si desea un solo control de usuario en un contenedor, coloque un ContentControl en su XAML y luego configure la propiedad Content. Si está utilizando un modelo de vista, se podría enlazar contenido a una propiedad FrameworkElement en el modelo de vista:

contentControlInstance.Content = new CustomUserControl(); 

Si desea que varios controles en una lista, utilice un ItemsControl y asignar una ObservableCollection <> a la propiedad ItemsSource . Si está utilizando un modelo de vista, puede vincular ItemsSource a una propiedad ObservableCollection en el Modelo de visualización.

A continuación, puede simplemente añadir/eliminar vistas desde que ObservableCollection:

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

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

private void AddView(FrameworkElement frameworkElement) 
{ 
    views.Add(frameworkElement); 
} 
4

Para agregar varios controles que necesita contenedor.

Suponga que tiene un contenedor "MyStack" StackPanel

<Window ..> 
    <StackPanel Name="MyStack" /> 
</Window> 

Puede crear dinámicamente el control y añadirlo al contenedor. Vea el código a continuación

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);  
} 
3

O use encuadernación. Aquí hay un ejemplo muy crudo que muestra cómo diferentes controles WPF se pueden mostrar en una sola ventana de WPF utilizando ContentControl y enlace (que es lo que hace un kit de herramientas como Prism o Caliburn Micro).

XAML:

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

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

Código:

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. 
} 
Cuestiones relacionadas