2009-09-03 10 views
27

एक से अधिक बच्चे को एक WPF StatusBar में जोड़ने के लिए अनुकूलित करने के लिए छोटे विकल्प के साथ खराब लेआउट में परिणाम। उदाहरण के लिए, इस कोड: मेंमैं WPF StatusBar लेआउट को कैसे अनुकूलित करूं?

<Window x:Class="StatusBar.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <DockPanel> 
     <StatusBar DockPanel.Dock="Bottom"> 
      <StatusBarItem> 
       <TextBlock>Ready</TextBlock> 
      </StatusBarItem> 
      <StatusBarItem> 
       <TextBlock>Set</TextBlock> 
      </StatusBarItem> 
     </StatusBar> 

     <Label>Main Content</Label> 
    </DockPanel> 
</Window> 

परिणाम:

enter image description here

यह आदर्श लेआउट, के बाद से "सेट" सही "रेडी" के खिलाफ निचोड़ा जाता है नहीं है।

मैं WPF StatusBar नियंत्रण के लेआउट पर पूर्ण नियंत्रण कैसे प्राप्त करूं?

उत्तर

72

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

स्थिति पट्टी बच्चों की स्थिति पर नियंत्रण के एक उच्च स्तर प्राप्त करने के लिए, आप एक Grid के लिए DockPanel बाहर स्वैप कर सकते हैं:

<Window x:Class="StatusBar.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <DockPanel> 
     <StatusBar DockPanel.Dock="Bottom"> 
      <StatusBar.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="*"/> 
         </Grid.RowDefinitions> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="4*"/> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="*"/> 
          <ColumnDefinition Width="*"/> 
         </Grid.ColumnDefinitions> 
        </Grid> 
       </ItemsPanelTemplate> 
      </StatusBar.ItemsPanel> 
      <StatusBarItem> 
       <TextBlock>Ready</TextBlock> 
      </StatusBarItem> 
      <StatusBarItem Grid.Column="1"> 
       <ProgressBar Value="30" Width="80" Height="18"/> 
      </StatusBarItem> 
      <StatusBarItem Grid.Column="2"> 
       <TextBlock>Set</TextBlock> 
      </StatusBarItem> 
      <StatusBarItem Grid.Column="3"> 
       <TextBlock>Go!</TextBlock> 
      </StatusBarItem> 
     </StatusBar> 

     <Label>Main Content</Label> 
    </DockPanel> 
</Window> 

इस में जो परिणाम:

enter image description here

के लिए अधिक गहन चर्चा, कृपया मेरे ब्लॉग पोस्ट here पर जाएं।

+36

@ डेविड: हास्यास्पद मत बनो। मैंने इस सवाल को पोस्ट किया क्योंकि Google Analytics ने मुझे बताया कि यह मेरी सबसे लोकप्रिय ब्लॉग पोस्टों में से एक था, इसलिए स्टैक ओवरफ्लो पर इस प्रश्न का सीधा जवाब समुदाय के लिए फायदेमंद होगा। मेरे पास मेरे ब्लॉग पर कोई विज्ञापन नहीं है इसलिए लिंक बैटिंग से कुछ हासिल करने के लिए खड़े न हों। और मैंने अपने जवाब में पर्याप्त जानकारी से अधिक रखा है कि आपको मेरे ब्लॉग पर जाने की भी आवश्यकता नहीं है जबतक कि आप अधिक जानकारी नहीं चाहते। अब कृपया जाओ और कुछ रचनात्मक खोजने के लिए। –

+0

धन्यवाद, यह वही है जो मैं –

+0

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

11

वास्तव में, केंट के जबाब निम्नलिखित मैं इस कोशिश की और यह ठीक काम करता है: बस उत्कृष्ट जवाब पढ़ने वालों के लिए संदर्भ के लिए

<StatusBar> 
    <StatusBarItem DockPanel.Dock="Right"> 
     <TextBlock>Go!</TextBlock> 
    </StatusBarItem> 
    <StatusBarItem DockPanel.Dock="Right"> 
     <TextBlock>Set</TextBlock> 
    </StatusBarItem> 
    <StatusBarItem DockPanel.Dock="Right"> 
     <ProgressBar Value="30" Width="80" Height="18"/> 
    </StatusBarItem> 
    <!-- Fill last child is true by default --> 
    <StatusBarItem> 
     <TextBlock>Ready</TextBlock> 
    </StatusBarItem> 
</StatusBar> 
+0

मैंने सुझाव नहीं दिया कि यह काम नहीं करेगा, लेकिन यह "गन्दा और असुविधाजनक" है क्योंकि यह एक अजीब क्रम में है, और क्योंकि आपके पास लेआउट पर बहुत कम नियंत्रण है। * सेट * आइटम को उपलब्ध चौड़ाई में आधा बनाने का प्रयास करें और आप देखेंगे कि मेरा क्या मतलब है। –

+6

मुझे लगता है कि यदि आप समझते हैं कि डॉकपैन कैसे काम करता है, तो यह करने का सबसे साफ तरीका है। – Sonhja

+0

काम नहीं कर रहा है अगर मेरी स्टेटसबार उपयोगकर्ता नियंत्रण में है और उस उपयोगकर्ता नियंत्रण को Contentcontrol के रूप में दिखाया जा रहा है जहां सामग्री नियंत्रण नीचे डॉक किया गया है। – juFo

1

ऊपर मैं और भी अधिक सरल है कि प्राप्त होता है कुछ सुझाव देना चाहते हैं एक ही परिणाम। (न तो DockPanel और न ही StatusBar का उपयोग करना)।

<Window> 
. 
. 

<Grid Margin="2"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="15"/> 
     </Grid.RowDefinitions> 

     <SomeContainer Grid.Row="0" /> <!-- Main Content.. --> 

     <Grid Grid.Row="1"> 
      <!-- Status bar laid out here (using similar approach)--> 
     </Grid> 
</Window> 

अस्वीकरण: यह बहुत समय पहले एक समय था जब मैं डब्ल्यूपीएफ के साथ शुरू कर रहा था।

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