WPF में मानक नियंत्रण के लिए DockStyle.Fill का उपयोग कैसे करें?


92

मैं विंडोज़ रूपों से उपयोग किया जाता हूं, कि मैं एक पैनल बनाता हूं, इसके अंदर नियंत्रण रखता हूं और उन्हें DockStyle.Fillअपने आकार को अधिकतम करने के लिए आसपास के पैनल पर देता हूं ।

डब्ल्यूपीएफ में मैं वही होना चाहता हूं। मेरे पास एक TabControl है और मैं चाहता हूं कि इसका आकार यथासंभव अधिक से अधिक फॉर्म भरें। मेरे पास एक रिबन नियंत्रण (RibbonControlsLibrary) है और मैं चाहता हूं कि बाकी का फॉर्म अधिकतम आकार में TabControl से भरा जाए।

(मैं दृश्य स्टूडियो में डॉकिंग की तरह डॉक नियंत्रण नहीं करना चाहता, बस पुराने डॉकिंग तंत्र)

जवाबों:


181

WinForms DockStyle.Fill के बराबर WPF है:

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

यह लगभग नियंत्रणों के लिए डिफ़ॉल्ट है, इसलिए सामान्य तौर पर आपको अपने मूल कंटेनर को भरने के लिए WPF नियंत्रण के लिए कुछ भी करने की आवश्यकता नहीं है : वे ऐसा स्वचालित रूप से करते हैं। यह सभी कंटेनरों के लिए सच है जो अपने बच्चों को न्यूनतम आकार तक नहीं निचोड़ते हैं।

साधारण गलती

अब मैं कई सामान्य गलतियों की व्याख्या करूंगा जो HorizontalAlignment="Stretch" VerticalAlignment="Stretch"उम्मीद के मुताबिक काम करने से रोकती हैं ।

1. स्पष्ट ऊँचाई या चौड़ाई

एक सामान्य गलती नियंत्रण के लिए एक चौड़ाई या ऊँचाई को स्पष्ट रूप से निर्दिष्ट करना है। तो अगर आपके पास यह है:

<Grid>
  <Button Content="Why am I not filling the window?" Width="200" Height="20" />
  ...
</Grid>

बस चौड़ाई और ऊंचाई विशेषताओं को हटा दें:

<Grid>
  <Button Content="Ahhh... problem solved" />
  ...
</Grid>

2. युक्त पैनल निचोड़ न्यूनतम आकार को नियंत्रित करता है

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

<StackPanel>
  <Button Content="Why am I squished flat?" />
</StackPanel>

दूसरे पैनल में बदलें और आपका जाना अच्छा होगा:

<DockPanel>
  <Button Content="I am no longer squished." />
</DockPanel>

इसके अलावा, कोई भी ग्रिड पंक्ति या स्तंभ जिसकी ऊंचाई "ऑटो" है, उसी तरह से उस दिशा में इसकी सामग्री को निचोड़ लेगा।

कंटेनरों के कुछ उदाहरण जो उनके बच्चों को निचोड़ते नहीं हैं:

  • ContentControls अपने बच्चों को कभी नहीं निचोड़ते (इसमें बॉर्डर, बटन, चेकबॉक्स, स्क्रॉल व्यूअर और कई अन्य शामिल हैं)
  • एक पंक्ति और स्तंभ के साथ ग्रिड
  • "*" पंक्तियों और स्तंभों के साथ ग्रिड
  • DockPanel अपने अंतिम बच्चे को नहीं निचोड़ता है
  • TabControl इसकी सामग्री को निचोड़ नहीं करता है

कंटेनरों के कुछ उदाहरण जो उनके बच्चों को निचोड़ते हैं:

  • स्टैकपैनल अपने ओरिएंटेशन दिशा में निचोड़ता है
  • उस दिशा में एक "ऑटो" आकार की पंक्ति या स्तंभ निचोड़ के साथ ग्रिड
  • DockPanel अपनी गोदी दिशा में अपने अंतिम बच्चे को छोड़ देती है
  • TabControl अपने हेडर को निचोड़ता है (टैब पर प्रदर्शित होता है)

3. स्पष्ट ऊँचाई या चौड़ाई आगे

यह आश्चर्यजनक है कि मैं कितनी बार ग्रिड या डॉकपैनल को इस तरह स्पष्ट ऊंचाई और चौड़ाई देता हुआ देखता हूं:

<Grid Width="200" Height="100">
  <Button Content="I am unnecessarily constrainted by my containing panel" />
</Grid>

सामान्य तौर पर आप कभी भी किसी पैनल को एक स्पष्ट ऊँचाई या चौड़ाई नहीं देना चाहते हैं। लेआउट समस्याओं का निदान करते समय मेरा पहला कदम प्रत्येक स्पष्ट ऊँचाई या चौड़ाई को निकालना है जो मैं पा सकता हूं।

4. विंडो SizeToContent है जब यह नहीं होना चाहिए

जब आप SizeToContent का उपयोग करते हैं, तो आपकी सामग्री न्यूनतम आकार तक निचोड़ ली जाएगी। कई अनुप्रयोगों में यह बहुत उपयोगी है और सही विकल्प है। लेकिन अगर आपकी सामग्री का कोई "प्राकृतिक" आकार नहीं है, तो आप शायद SizeToContent को छोड़ना चाहेंगे।


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

7
बहुत बढ़िया जवाब! काश मैं किसी तरह आपको बोनस अंक दे पाता। :)
जिम राडेन

@ जैम राडेन: आप इस प्रश्न के लिए एक इनाम जोड़ सकते हैं और रे बर्न्स को अंक प्रदान कर सकते हैं;)
सिट्रोनास

1
भविष्य के पाठकों के लिए साइड नोट: यह डिज़ाइन दृश्य में तब तक अपडेट नहीं होगा, जब तक कि आप पुन: प्रस्तुत नहीं करते।
डेविड

"<बटन सामग्री =" मैं खिड़की क्यों नहीं भर रहा हूं? "चौड़ाई =" 200 "ऊँचाई =" 20 "/>" मुझे फटा! XD
जैक फ्रॉस्ट

7

आप केवल कह कर जो चाहते हैं वह कर सकते हैं DockPanel LastChildFill="True"और फिर यह सुनिश्चित कर सकते हैं कि आप जो भरना चाहते हैं वह वास्तव में आखिरी बच्चा है!

ग्रिड एक लेआउट का जानवर है जिसे आप कुछ भी कर सकते हैं, लेकिन DockPanel आमतौर पर आपके सबसे बाहरी लेआउट पैनल के लिए सही विकल्प है। यहाँ एक psuedocode उदाहरण दिया गया है:

<DockPanel LastChildFill="True">
    <MyMenuBar DockPanel.Dock="Top"/>
    <MyStatus DockPanel.Dock="Bottom"/>

    <MyFillingTabControl />
</DockPanel>

5

बस दो पंक्तियों के साथ एक ग्रिड में अपने नियंत्रण लपेटो। ग्रिड स्वचालित रूप से इसे दिए गए सभी स्थान का उपयोग करेगा और आप पंक्तियों को "*" की ऊंचाई देकर छोड़ दिए गए सभी स्थान को लेने के लिए परिभाषित कर सकते हैं। मेरे उदाहरण में पहली पंक्ति (ऊँचाई = "ऑटो") रिबन द्वारा आवश्यकतानुसार उतनी ही जगह लेगी। उम्मीद है की वो मदद करदे।

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>

  <Ribbon Grid.Row="0" />

  <TabPage Grid.Row="1" />
</Grid>

ग्रिड के बच्चे नियंत्रण के लिए "ग्रिड। आरओ = .." को जोड़कर वे ग्रिड की पंक्तियों को सौंपा जाता है। फिर ग्रिड आकार देगा यह बच्चों की पंक्ति परिभाषाओं द्वारा परिभाषित है।


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

आपको TabControl के लिए "Grid.Row" विशेषता को जोड़ने और इसी पंक्ति को "*" की ऊंचाई देने की आवश्यकता है - जैसा कि उदाहरण में दिखाया गया है।
जूल

0

मैं यहाँ कई तरीके आज़मा रहा था लेकिन अपनी समस्या हल नहीं कर पाया। (नियंत्रण में अन्य नियंत्रण भरें)

जब तक मैंने पाया यह

<Name_Control Height="auto" Width="auto"/>
//default
//HorizontalAlignment="Stretch" 
//VerticalAlignment="Stretch"

उदाहरण:

//UserControl:
<UserControl Name="UC_Test" Height="auto" Width="auto" />
//Grid: 
<Grid Name="Grid_test" Grid.ColumnSpan="2" Grid.Row="2" />
//Code: 
Grid_test.Children.Add(UC_Test);

आसान डिजाइन के लिए

<UserControl Name="UC_Test" Height="100" Width="100" />
//Code
Grid_test.Children.Add(UC_Test);
UC_Test.Width = Double.NaN;
UC_Test.Height = Double.NaN;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.