2009-11-21 16 views
11

मैं WPF आधारित विंडो को गतिशील रूप से (रनटाइम पर कोड का उपयोग करके) में WPF आधारित उपयोगकर्ता नियंत्रण कैसे लोड कर सकता हूं?डब्ल्यूपीएफ: मैं गतिशील रूप से उपयोगकर्ता नियंत्रण कैसे लोड करूं?

उत्तर

21

मैं अत्यधिक Prism पर एक नज़र रखने की अनुशंसा करता हूं, क्योंकि समग्र उपयोगकर्ता इंटरफेस यह है कि यह क्या है। हालांकि, चूंकि आपको अपने पूरे एप्लिकेशन को दोबारा करने की आवश्यकता होगी, इसलिए मैं सीधे आपके प्रश्न का उत्तर दूंगा।

यदि आप एक कंटेनर में एकल उपयोगकर्ता नियंत्रण चाहते हैं, तो अपने XAML में ContentControl डालें और फिर सामग्री प्रॉपर्टी सेट करें।

contentControlInstance.Content = new CustomUserControl(); 

आप एक सूची में एक से अधिक नियंत्रण चाहते हैं, तो एक ItemsControl का उपयोग करें और ItemsSource संपत्ति के लिए एक ObservableCollection <> आवंटित: यदि आप एक दृश्य के मॉडल का उपयोग कर रहे हैं, तो आप दृश्य मॉडल पर एक FrameworkElement संपत्ति के लिए सामग्री के लिए बाध्य कर सकता है । यदि आप एक व्यू मॉडल का उपयोग कर रहे हैं, तो आप व्यू मॉडल पर एक ऑब्जर्जेबल कोलेक्शन प्रॉपर्टी में आइटम्ससोर्स को बाध्य कर सकते हैं।

तो फिर तुम सिर्फ जोड़ सकते हैं/कि 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

कोड देखें या बंधन का उपयोग करें। यहां एक वास्तव में कच्चा उदाहरण दिया गया है जिसमें सामग्री कंट्रोल और बाइंडिंग (जो कि प्रिज्म या कैलिबर्न माइक्रो की तरह टूलकिट है) का उपयोग करके एक 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. 
} 
संबंधित मुद्दे