मैं अपनी सूची बॉक्स में एक ऊर्ध्वाधर स्क्रॉलबार कैसे प्राप्त कर सकता हूं?


84

नीचे दिए गए उदाहरण में मेरे पास दर्जनों फ़ॉन्ट नामों के साथ एक सूची बॉक्स है।

मुझे लगता है कि यह स्वचालित रूप से इस पर एक ऊर्ध्वाधर स्क्रॉलबार होगा ताकि आप किसी भी फ़ॉन्ट का चयन कर सकें, न केवल सूची में पहले वाले, बल्कि यह नहीं है।

इसलिए मैंने एक "स्क्रॉलव्यूअर" जोड़ा और यह दाईं ओर "स्क्रॉलबार क्षेत्र" डालता है लेकिन स्क्रॉलबार क्षेत्र में कोई स्क्रॉलबार नहीं है ताकि आप स्क्रॉल कर सकें (!)।

स्क्रॉलबार स्वचालित क्यों नहीं है और मैं इसे स्क्रॉलबार के लिए कैसे बाध्य करूं?

<StackPanel Name="stack1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <ScrollViewer>
            <ListBox Grid.Row="0" Name="lstFonts" Margin="3"  ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
        </ScrollViewer>
    </Grid>
</StackPanel>

जवाबों:


151

आपके समाधान के साथ समस्या यह है कि आप एक लिस्टबॉक्स के चारों ओर एक स्क्रॉलबार लगा रहे हैं जहाँ आप शायद इसे लिस्टबॉक्स के अंदर रखना चाहते हैं।

यदि आप अपने ListBox में एक स्क्रॉलबार को बाध्य करना चाहते हैं, तो स्क्रॉलबार का उपयोग करें ।VerticalScrollBarVisibility संलग्न संपत्ति।

<ListBox 
    ItemsSource="{Binding}" 
    ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>

इस मान को ऑटो पर सेट करने से स्क्रॉलबार को आवश्यकतानुसार आधार पर पॉपअप किया जाएगा।


3
मेरे मामले में मैंने ListBoxअंदर ScrollViewerभी डाल दिया था और ListBoxItemsवे जितना चौड़ा चाहते थे, उतने ही विस्तृत थे ListBox। निकाल रहा है ScrollViewerऔर स्थापित करने ScrollViewer.VerticalScrollBarVisibility="Visible"और ScrollViewer.HorizontalScrollBarVisibility="Disabled"चाल थी। आपके सहयोग के लिए धन्यवाद!
मंडारिन

30

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

अंतरिक्ष की तुलना में अधिक सामग्री होने की स्थिति की गणना करने के लिए, आकार ज्ञात होना चाहिए। सुनिश्चित करें कि आपके ListBoxपास एक विवश आकार है, या तो ListBoxतत्व पर स्पष्ट रूप से आकार सेट करके या होस्ट पैनल से।

यदि होस्ट पैनल लंबवत है StackPanelऔर आप चाहते VerticalScrollBarहैं कि आप ListBoxस्वयं ही ऊँचाई निर्धारित कर लें। अन्य प्रकार के कंटेनरों के लिए, उदाहरण के लिएGrid , ListBoxकंटेनर द्वारा विवश किया जा सकता है। उदाहरण के लिए, आप इस तरह दिखने के लिए अपना मूल कोड बदल सकते हैं:

<Grid Name="grid1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0" Name="lstFonts" Margin="3"
                 ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
    </Grid>
</Grid>

ध्यान दें कि यह सिर्फ तत्काल कंटेनर नहीं है जो महत्वपूर्ण है। आपके उदाहरण में, तत्काल कंटेनर एक है Grid, लेकिन क्योंकि यह Gridएक द्वारा समाहित है StackPanel, बाहरी StackPanelका विस्तार उसके तत्काल बच्चे को समायोजित करने के लिए किया जाता हैGrid , जैसे कि वह बच्चा अपने बच्चे ( ListBox) को समायोजित करने के लिए विस्तार कर सकता है ।

यदि आप किसी भी बिंदु पर ऊंचाई को बाधित करते हैं - की ऊंचाई ListBoxनिर्धारित करके Grid, आंतरिक की ऊंचाई निर्धारित करके , या बस बाहरी कंटेनर बनाकर Grid- तो एक ऊर्ध्वाधर स्क्रॉल बार स्वचालित रूप से किसी भी समय दिखाई देगा कई सूची आइटम हैं नियंत्रण में है।


DockPanel का उपयोग मूल कंटेनर के रूप में यह जानने की आवश्यकता को छोड़ देता है कि आप कितने तत्वों को बच्चे के रूप में जोड़ने की योजना बनाते हैं या किसी भी ऊँचाई विशेषता को पूर्वनिर्धारित करते हैं। प्रत्येक बच्चे के लिए DockPanel.Dock = Top परिभाषित करें। यह आपके "स्क्रॉलव्यूअर-चिल्ड्स" को स्क्रॉलबार को आवश्यकतानुसार प्रदर्शित करता है। आम तौर पर परीक्षण नहीं किया गया, यह मेरे usecase में काम करता है। BR, डैनियल
dba

1
TLDR: अपने मूल तत्व StackPanelको Gridतब से बदल दें क्योंकि StackPanel हमेशा अपने बच्चों की ऊंचाई तक फैलता है।
जोश नू

17

मैंने अपने ListBox में एक "ऊँचाई" जोड़ी और इसने स्क्रॉलबार को अच्छी तरह से जोड़ा।


8
ऊंचाई और चौड़ाई के गुणों का उपयोग करने से बचने की कोशिश करें क्योंकि वे सड़क पर बदलाव को मुश्किल बना सकते हैं। तुम बेहतर हो JaredPar के समाधान के साथ जा रहे हैं।
ब्रायन एंडरसन

1
मैं ऐसा करता हूं, लेकिन यह बिना स्क्रॉलबार के दाईं ओर एक "स्क्रॉलबार क्षेत्र" डालता है, और मेरी सूची मेरी खिड़की के नीचे से सभी अनंत काल तक नीचे चली जाती है, मैं कैसे सूची बॉक्स (खिड़की के नीचे रोक) को बता सकता हूं )?
एडवर्ड तुंगाय

15
क्योंकि यह एक StackPanel में है, इसलिए इसे पूरी तरह से इसकी ज़रूरत वाले सभी स्थान दिए जा रहे हैं, इसलिए यह नहीं लगता कि इसे स्क्रॉलबार की आवश्यकता है।
डोनलल

4

स्क्रॉल पट्टी को स्वचालित रूप से सूची बॉक्स में तब तक जोड़ा जाता है जब तक कि इसकी दृश्यता छिपे पर सेट न हो जाए। जब भी सूची आइटम का आकार एक से अधिक होता है, जो सूची बॉक्स के अंदर दिखाया जा सकता है ऊर्ध्वाधर या क्षैतिज सूची बॉक्स को रन समय के दौरान देखा जा सकता है।


1

मेरे मामले में सूची बॉक्स में आइटमों की संख्या गतिशील है इसलिए मैं ऊँचाई की संपत्ति का उपयोग नहीं करना चाहता था। मैंने इसके बजाय मैक्सहाइट का इस्तेमाल किया और यह अच्छी तरह से काम करता है। स्क्रॉलबार तब दिखाई देता है जब यह उस स्थान को भर देता है जिसे मैंने इसके लिए आवंटित किया है।


0

मैं एक ही समस्या थी, मैं एक ComboBox एक StackPanel में ListBox द्वारा पीछा किया गया था और ListBox के लिए स्क्रॉल पट्टी नहीं दिखा रहा था। मैं बजाय एक DockPanel में दोनों रखकर इसे हल किया। मैंने ComboBox DockPanel.Dock = "टॉप" सेट किया और लिस्टबॉक्स को शेष स्थान को भरने दिया।


0

XAML लिस्टबॉक्स स्कोरर - विंडोज 10 (UWP)

<Style TargetType="ListBox">
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>

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