2009-01-07 22 views
18

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

  1. एक मुख्य विंडो
  2. शीर्ष कोने
  3. एक शीर्षक ब्लॉक
  4. एक में एक लोगो स्टेटस डिस्प्लेर नीचे
  5. विंडो विशिष्ट नियंत्रण के लिए एक क्षेत्र।

इस समय मुझे हर खिड़की में इस संरचना को फिर से बनाना होगा। आदर्श रूप से मैं इस लेआउट को एक ही स्थान पर कोडित करना चाहता हूं, शायद उपयोग की आसानी के लिए एक कस्टम विंडो उपclass में। क्या किसी के पास प्रारंभ करने के लिए कोई संकेत है, या इसी तरह की समस्याओं के साथ पिछले अनुभव?

उत्तर

31

आप एक नया कंट्रोल टेम्पलेट बना सकते हैं जो नीचे दिखाए गए अनुसार इसे पूरा करने के लिए विंडो को लक्षित करता है।

<ControlTemplate x:Key="WindowControlTemplate1" TargetType="{x:Type Window}"> 
    <Border 
     Background="{TemplateBinding Background}" 
     BorderBrush="{TemplateBinding BorderBrush}" 
     BorderThickness="{TemplateBinding BorderThickness}" 
     > 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="0.93*"/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 

      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.21*"/> 
       <ColumnDefinition Width="0.79*"/> 
      </Grid.ColumnDefinitions> 

      <ContentPresenter 
       Grid.ColumnSpan="2" 
       Grid.Row="1" 
       Content="{TemplateBinding Content}" 
       ContentTemplate="{TemplateBinding ContentTemplate}" 
       /> 
      <ResizeGrip 
       HorizontalAlignment="Right" 
       x:Name="WindowResizeGrip" 
       VerticalAlignment="Bottom" 
       IsTabStop="False" 
       Visibility="Collapsed" 
       Grid.Column="1" 
       Grid.Row="2" 
       /> 
      <TextBlock Text="My Logo" /> 
      <TextBlock Grid.Column="1" Text="My Title"/> 
      <StatusBar Height="20" Grid.ColumnSpan="2" Grid.Row="2"/> 
     </Grid> 
    </Border> 

    <ControlTemplate.Triggers> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="ResizeMode" Value="CanResizeWithGrip"/> 
       <Condition Property="WindowState" Value="Normal"/> 
      </MultiTrigger.Conditions> 
      <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/> 
     </MultiTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
+0

धन्यवाद! यह वही है जो मैं बाद में हूं! धन्यवाद :) – NoizWaves

-3

आप "बहुत सारी खिड़कियों" का उपयोग क्यों कर रहे हैं? एक टैब नियंत्रण के साथ सिर्फ एक खिड़की क्यों नहीं? या उपयोगकर्ता नियंत्रण के साथ एक खिड़की?

भले ही, अपने प्रश्न का उत्तर देने के लिए, उपयोगकर्ता नियंत्रण एक तरीका है जिसे आप इच्छित कार्यक्षमता प्राप्त करना चाहते हैं जिसे आप चाहते हैं।

एक नई विंडो क्लास बनाएं, और उसके पास "बच्चों" संपत्ति है जो ऑब्जेक्ट को डॉक पैनल में एम्बेड करने की अनुमति देता है जहां आप "विंडो विशिष्ट नियंत्रण" जाना चाहते हैं।

जैसे ही आप नई विंडो लॉन्च करते हैं, विंडो प्रकार को तुरंत चालू करते हैं, और विशिष्ट नियंत्रण के साथ उपयोगकर्ता नियंत्रण, उपयोगकर्ता विंडो को अपनी विंडो की बच्चों की संपत्ति में जोड़ें, और फिर विंडो दिखाएं। आप ईवेंट हैंडलर, डेटाकॉन्टेक्स और यहां तक ​​कि इस समय क्या नहीं जोड़ सकते हैं।

+1

इतने सारे डाउनवॉट क्यों? मुझे एक वैध प्रश्न की तरह लगता है, शायद आदर्श जवाब नहीं, लेकिन सही स्थिति के लिए विचार करना निश्चित रूप से लायक है। – MikeKulls

+0

क्योंकि यह एक समाधान प्रस्तुत करता है, यह वास्तव में सवाल का जवाब नहीं देता है। इसके अतिरिक्त, यह समाधान की एक अत्यधिक ब्रूट फोर्स विधि है। सभी वास्तविकता में, मैं इसे एक WPF एक (जिसे चयनित उत्तर है) पर हल करने की WINFORMS विधि के रूप में वर्णित करता हूं। –

+0

हो सकता है कि आप "टैब नियंत्रण वाले एकल विंडो" पर बहुत अधिक ध्यान केंद्रित कर रहे हों ?? अदला-बदली उपयोगकर्ता नियंत्रण वाली एकल खिड़की सही स्थिति में एक बिल्कुल वैध समाधान है। यह एकमात्र समाधान है जो कोड डुप्लिकेशंस से बचाता है, यदि आपके पास 1 से अधिक विंडो हैं तो किसी प्रकार का कोड, चाहे कितना छोटा हो, उन विंडो में से प्रत्येक में डुप्लिकेट की आवश्यकता हो। यदि आवश्यक परिवर्तन हैं तो उस कोड को कई स्थानों में बदला जाना चाहिए। यह किसी भी तरह का सौदा ब्रेकर नहीं है लेकिन यह निश्चित रूप से विचार करने योग्य है। – MikeKulls

6

यदि आप एक बड़ी वास्तुकला शिफ्ट लेने के लिए पर्याप्त बहादुर हैं तो आप पैटर्न & माइक्रोसॉफ्ट में प्रैक्टिस लड़कों से CompositeWPF (पहले कोडनामेड प्रिज्म) पर विचार कर सकते हैं।

आपकी रुचि के लिए एक शैल (यानी खिड़की) में "क्षेत्रों" को परिभाषित करने और फिर क्षेत्रों को भरने के लिए विचारों का उपयोग करने की क्षमता होगी। यह मॉडल से "विचार" के स्वतंत्र विकास की अनुमति देने के लिए मॉडल-व्यू-प्रेजेंटर पैटर्न का उपयोग करता है, जिसे आसानी से समय के साथ स्थानांतरित किया जा सकता है क्योंकि शेल केवल क्षेत्रों को परिभाषित करता है और इसमें सीधे जो कुछ भी रखा जाता है, उससे सीधे नहीं जोड़ा जाता है। मुख्य रूप से यह विचारों से एक दूसरे से विचारों को खोलने में मदद करता है और यूनिट-टेस्ट के लिए इसे आसान बनाता है ... ब्लाह, ब्ला ब्लाह।

यह एक बड़ी छलांग है और कुछ ऐसा जो आपको धीमा कर देगा, हालांकि आपकी स्थिति उन अनुप्रयोगों में से एक है जो कंपोजिट डब्लूपीएफ को संबोधित करने के लिए है।

कंपोजिट WPF के हिस्से के रूप में आपको बोर्ड पर विभिन्न पैटर्न लेना होगा जो नए आने वालों को भ्रमित कर सकते हैं, उदा। यूनिटीकॉन्टेनर, इनवर्जन-ऑफ-कंट्रोल, एमवीपी (या मॉडल/व्यू/व्यू-मॉडल) और निर्भरता इंजेक्शन।

मुझे याद है जब मैंने पहली बार सैंपल ऐप्स को परेशान किया था क्योंकि यह स्पष्ट नहीं है कि पृथ्वी पर कुछ विचार कैसे बनाए जा रहे थे! एकता कंटेनर ऑब्जेक्ट्स को तुरंत चालू करेगा और जादुई रूप से पैरामीटरयुक्त कन्स्ट्रक्टर को कॉल करेगा।

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

+0

CompositeWPF के लिए आपके विस्तृत परिचय के लिए धन्यवाद। मैंने WPF के लिए समग्र एप्लिकेशन मार्गदर्शन डाउनलोड किया और अधिक उलझन में आया, मैं सोच रहा था कि क्या एक नए कमर के लिए सीखने के लिए कोई आसान उदाहरण है? – Picflight

+0

@ पिकफलाइट: यहां डेवएक्स http://www.devx.com/codemag/Article/40165/1763 पर ब्रायन नोयस आलेख का एक लिंक है। जहां भी आप नमूना कोड प्राप्त कर सकते हैं, डीबगर का उपयोग करें ताकि आप सीख सकें कि चीजें कैसे काम करती हैं। कक्षाओं के रचनाकारों पर ब्रेकपॉइंट रखें और यह देखने के लिए कॉल स्टैक पर जाएं कि यह कैसे काम करता है। – Rhys

2

सबसे सरल तरीका WPF को विंडो विशिष्ट नियंत्रणों के लिए "पृष्ठ" बनाना और मुख्य विंडो में "फ़्रेम" रखना है। आप इस तरह एक अच्छी नेविगेशन भी बना सकते हैं।

संबंधित मुद्दे