2009-11-21 95 views

回答

21

我強烈建議看看Prism,因爲複合用戶界面是它的用途。但是,由於這需要您重構整個應用程序,因此我也會直接回答您的問題。

如果您想在容器中使用單個用戶控件,請將ContentControl放入您的XAML中,然後設置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); 
} 
4

對於添加多個控件,你需要的容器。

假設你有一個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);  
} 
3

或使用綁定。下面是一個非常粗糙的例子,展示瞭如何使用ContentControl和綁定(這是Prism或Caliburn Micro的工具包)在單個WPF窗口中顯示不同的WPF控件。

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