WPF नेविगेशन के लिए विंडो बनाम पेज बनाम यूजरकंट्रोल?


192

मैं वर्तमान में एक डेस्कटॉप एप्लिकेशन लिख रहा हूं, लेकिन मैं किसी एप्लिकेशन के नए अनुभाग में किसी को रीडायरेक्ट करने के दौरान अपने सिर को पाने के लिए उपयोग नहीं कर सकता हूं।

मेरे विकल्प प्रतीत होते हैं

  • खिड़की
  • पृष्ठ
  • UserControl

लेकिन मुझे समझ नहीं आ रहा है कि उनके बीच क्या अंतर है, और जब मुझे हर एक का उपयोग करना चाहिए।

क्या कोई मेरे लिए मतभेदों की व्याख्या कर सकता है, और उदाहरण दे सकता है कि आप प्रत्येक के लिए किन स्थितियों / अनुप्रयोगों का उपयोग कर सकते हैं?

जवाबों:


337

एक विंडो ऑब्जेक्ट बस ऐसा लगता है जैसे कि: यह Windowआपके एप्लिकेशन के लिए एक नया है । जब आप पूरी तरह से नई विंडो पॉप अप करना चाहते हैं तो आपको इसका उपयोग करना चाहिए। मैं अक्सर WindowWPF में एक से अधिक का उपयोग नहीं करता हूं क्योंकि मैं अपने मुख्य विंडो में गतिशील सामग्री डालना पसंद करता हूं जो उपयोगकर्ता की कार्रवाई के आधार पर बदलता है।

एक पृष्ठ आपके विंडो के अंदर एक पृष्ठ है। यह ज्यादातर XBAP जैसी वेब-आधारित प्रणालियों के लिए उपयोग किया जाता है, जहां आपके पास एक एकल ब्राउज़र विंडो होती है और उस विंडो में विभिन्न पृष्ठों को होस्ट किया जा सकता है। इसका उपयोग नेविगेशन अनुप्रयोगों में भी किया जा सकता है, जैसे कि sellmeadog ने कहा

एक UserControl एक पुन: प्रयोज्य उपयोगकर्ता-निर्मित नियंत्रण है जिसे आप अपने UI में उसी तरह जोड़ सकते हैं जैसे आप कोई अन्य नियंत्रण जोड़ते हैं। आमतौर पर UserControlजब मैं कुछ कस्टम फंक्शनलिटी में निर्माण करना चाहता हूं (उदाहरण के लिए, ए CalendarControl), या जब मेरे पास संबंधित एक्सएएमएल कोड की एक बड़ी मात्रा होती है, जैसे Viewकि एमवीवीएम डिजाइन पैटर्न का उपयोग करते समय।

खिड़कियों के बीच नेविगेट करते समय, आप बस एक नई Windowवस्तु बना सकते हैं और इसे दिखा सकते हैं

var NewWindow = new MyWindow();
newWindow.Show();

लेकिन जैसा कि मैंने इस उत्तर की शुरुआत में कहा था, मैं संभव हो तो कई खिड़कियों का प्रबंधन नहीं करना पसंद करता हूं।

नेविगेशन का मेरा पसंदीदा तरीका कुछ गतिशील सामग्री क्षेत्र का उपयोग करके बनाना है ContentControl, और इसे आबाद करना है UserControlजिसमें वर्तमान दृश्य जो भी हो।

<Window x:Class="MyNamespace.MainWindow" ...>
    <DockPanel>
        <ContentControl x:Name="ContentArea" />
    </DockPanel>
</Window>

और अपने नेविगेट इवेंट में आप बस इसका उपयोग करके सेट कर सकते हैं

ContentArea.Content = new MyUserControl();

लेकिन अगर आप WPF के साथ काम कर रहे हैं, तो मैं MVVM डिज़ाइन पैटर्न की अत्यधिक अनुशंसा करूँगा। मेरे पास अपने ब्लॉग पर एक बहुत ही बुनियादी उदाहरण है जो दिखाता है कि आप इस पैटर्न का उपयोग करके MVVM का उपयोग करके कैसे नेविगेट करेंगे:

<Window x:Class="SimpleMVVMExample.ApplicationView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SimpleMVVMExample"
        Title="Simple MVVM Example" Height="350" Width="525">

   <Window.Resources>
      <DataTemplate DataType="{x:Type local:HomeViewModel}">
         <local:HomeView /> <!-- This is a UserControl -->
      </DataTemplate>
      <DataTemplate DataType="{x:Type local:ProductsViewModel}">
         <local:ProductsView /> <!-- This is a UserControl -->
      </DataTemplate>
   </Window.Resources>

   <DockPanel>
      <!-- Navigation Buttons -->
      <Border DockPanel.Dock="Left" BorderBrush="Black"
                                    BorderThickness="0,0,1,0">
         <ItemsControl ItemsSource="{Binding PageViewModels}">
            <ItemsControl.ItemTemplate>
               <DataTemplate>
                  <Button Content="{Binding Name}"
                          Command="{Binding DataContext.ChangePageCommand,
                             RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                          CommandParameter="{Binding }"
                          Margin="2,5"/>
               </DataTemplate>
            </ItemsControl.ItemTemplate>
         </ItemsControl>
      </Border>

      <!-- Content Area -->
      <ContentControl Content="{Binding CurrentPageViewModel}" />
   </DockPanel>
</Window>

Screenshot1 screenshot2


मेरे पास एक सवाल है, MVVM मैं जो बता सकता हूं वह डेटासेट के साथ अच्छी तरह से काम करता है, लेकिन उदाहरण के लिए स्थैतिक रूपों के बारे में क्या है जो ऑडिट के लिए एक प्रवेश पत्र है। क्या मुझे स्थैतिक पृष्ठों के लिए एक पृष्ठ या usercontrol का उपयोग करना चाहिए?
हेरोज़रो

2
@Herrozerro यदि मैं MVVM का उपयोग करके एक ऑडिट फॉर्म बनाना चाहता था, तो मेरे पास AuditViewModelफॉर्म के लिए सभी डेटा और कार्यक्षमता होगी, और मैं इसे एक AuditViewUserControl, या सिर्फ एक का उपयोग करके आकर्षित करूँगाDataTemplate
राहेल

1
धन्यवाद! वास्तव में आपके ब्लॉग और कुछ अन्य साइटों के माध्यम से जाने के बाद, मुझे इस बात की बेहतर समझ है कि एमवीवीएम कैसे काम करता है।
हेरोइज़रो

1
@ हिरोज़रो ViewModelआमतौर पर इसके लिए बनाया गया है View, जबकि आपके Modelsऑब्जेक्ट द्वारा उपयोग किए जाने वाले डेटा ऑब्जेक्ट्स और क्लासेस ("बिल्डिंग ब्लॉक्स") हैं ( ViewModels)
राहेल

1
@ GTS13 हाँ मैं ऐसा अक्सर करता हूं। मैं TabControl.ItemsSourceऑब्जेक्ट के संग्रह को बांधता हूं , और WPF को बताने के लिए DataTemplates का उपयोग करता हूं कि प्रत्येक टैब पर प्रत्येक ऑब्जेक्ट प्रकार को कैसे आकर्षित किया जाए। आम तौर पर कुछ इस
राहेल

13
  • खिड़की की तरह है Windows.Forms.Form, तो बस एक नई खिड़की है
  • पृष्ठ ऑनलाइन दस्तावेज़ के अनुसार है :

    Windows इंटरनेट एक्सप्लोरर, नेवीव्यूडाउन और फ़्रेम द्वारा नेविगेट और होस्ट की जा सकने वाली सामग्री के एक पृष्ठ को एन्क्रिप्ट करता है।

    इसलिए आप मूल रूप से इसका उपयोग करते हैं यदि आप कुछ HTML सामग्री की कल्पना करते हैं

  • UserControl उन मामलों के लिए है, जब आप इसे अलग-अलग उपयोग करने के लिए कुछ पुन: प्रयोज्य घटक (लेकिन स्टैंडअलोन एक नहीं) बनाना चाहते हैंWindows


आपके उत्तर के लिए धन्यवाद। उदाहरण के लिए यदि आप एक ऐसे ऐप का निर्माण कर रहे थे जिसमें बाईं ओर बटन थे लेकिन आप दाहिने हाथ की तरफ इन बटन के अंदर की सामग्री देखना चाहते थे तो आप एक उपयोगकर्ता नियंत्रण का उपयोग करेंगे?
22

@ साइट: उस UserControlस्थिति में उपयोग करें जहां आपको लगता है कि नियंत्रण का एक ही सेट जिसे आप इस विंडो पर उपयोग करने जा रहे हैं आप किसी अन्य पर भी उपयोग करेंगे, इसलिए डबल कोड लिखने के बजाय, बस एक बनाएं UserControl, लेकिन यदि नहीं, तो बस विज़ुअलाइज़ेशन के विज़ुअलाइज़ेशन के लिए नियंत्रण रखें अपने Windowआप ही डेटा , बटन से दाईं ओर आप mantioned।
तिगरान

6
एक और आइटम है जो मुझे लगता है कि जोड़ा जाना चाहिए DataTemplates:। इनका उपयोग तब किया जाता है जब आप WPF को बताना चाहते हैं कि किसी विशिष्ट दायरे में किसी वस्तु को कैसे आकर्षित किया जाए। उदाहरण के लिए, यदि आप अपने Buttonsगोल घेरे बनाना चाहते थे, तो आप DataTemplateइसके बजाय बस का उपयोग कर सकते थे UserControl। मैं आमतौर पर उपयोग करता UserControlsहूं जब मैं अपनी कार्यक्षमता के साथ एक नया नियंत्रण चाहता हूं, या जब मेरे पास एक एकल घटक के लिए बहुत सारे एक्सएएमएल हैं, जैसे कि ए View। XAML के छोटे बिट्स के लिए जिन्हें किसी विशेष कार्यक्षमता की आवश्यकता नहीं होती है, आपको एक DataTemplateबनाने की बजाय इसका उपयोग करना चाहिएUserControl
राहेल

3
सामान्य तौर पर एक की सामग्री PageHTML नहीं बल्कि XAML है। हालाँकि, एक Pageनेविगेशन ढांचे में बंधा होता है जो वैचारिक रूप से एक वेब ब्राउज़र में नेविगेशन कैसे किया जाता है के समान है। (और अगर आवेदन एक XBAP अनुप्रयोग है, तो पेज भी एक ब्राउज़र में होस्ट किए जा सकते हैं।)
मार्टिन लेविस

6

सभी उस ऐप पर निर्भर करता है जिसे आप बनाने की कोशिश कर रहे हैं। Windowयदि आप संवाद आधारित ऐप बना रहे हैं, तो एस का उपयोग करें । Pageयदि आप नेविगेशन आधारित ऐप का निर्माण कर रहे हैं तो एस का उपयोग करें । UserControls आपके लिए जाने वाली दिशा की परवाह किए बिना उपयोगी होगा क्योंकि आप उन्हें विंडोज और पेज दोनों में उपयोग कर सकते हैं।

खोज शुरू करने के लिए एक अच्छी जगह यहाँ है: http://windowsclient.net/learn


5

हम आमतौर पर वन मेन का उपयोग Windowएप्लिकेशन के लिए करते हैं और अन्य विंडो का उपयोग उन स्थितियों में किया जा सकता है, जब आपको पॉपअप की आवश्यकता होती है क्योंकि XAML में पॉपअप नियंत्रण का उपयोग करने के बजाय जो दिखाई नहीं देते हैं हम डिज़ाइन समय पर दिखाई देने वाली विंडो का उपयोग कर सकते हैं ताकि यह आसान हो जाए काम साथ में करने केलिए

दूसरी ओर हम कई पृष्ठों का उपयोग एक स्क्रीन से दूसरे स्क्रीन पर नेविगेट करने के लिए करते हैं जैसे उपयोगकर्ता प्रबंधन स्क्रीन से ऑर्डर स्क्रीन आदि। मुख्य विंडो में हम Frameनेविगेशन के लिए नियंत्रण का उपयोग कर सकते हैं जैसे नीचे XAML

    <Frame Name="mainWinFrame" NavigationUIVisibility="Hidden"  ButtonBase.Click="mainWinFrame_Click">
    </Frame>

सी#

     private void mainWinFrame_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            if (e.OriginalSource is Button)
            {
                Button btn = (Button)e.OriginalSource;

                if ((btn.CommandParameter != null) && (btn.CommandParameter.Equals("Order")))
                {

                    mainWinFrame.Navigate(OrderPage);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error");
        }
    }

इसे करने का एक तरीका यह है कि हम फ्रैम के बजाय एक टैब कंट्रोल का भी उपयोग कर सकते हैं और नए पेज की जाँच के दौरान एक शब्दकोश का उपयोग करते हुए पृष्ठों को जोड़ सकते हैं यदि नियंत्रण पहले से मौजूद है तो केवल अन्यथा जोड़ें और नेविगेट करें। मुझे उम्मीद है कि वह किसी की मदद करेंगे


2

अधिकांश ने सही उत्तर पोस्ट किया है। मैं कुछ लिंक जोड़ना चाहूंगा, ताकि आप उनका उल्लेख कर सकें और उसी के बारे में स्पष्ट और बेहतर विचार रख सकें:

UserControl: http://msdn.microsoft.com/en-IN/library/a6h7e207(v=vs.71).aspx

WPF के संबंध में पेज और विंडो के बीच का अंतर: WPF में पेज बनाम विंडो?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.