2016-02-26 11 views
5

बिना भरे हुए हैं दिखाने के लिए WrapPanel बनाने के लिए। इसलिए, मैं वर्टिकल स्क्रॉलबार दिखाना चाहता हूं जब रैपपैनल बटन (बच्चों) से भरा होता है ताकि वे लगातार बटन जोड़ सकें।कैसे खड़ी स्क्रॉलबार जब बच्चे मैं एक WrapPanel और बटन प्रोग्राम के रूप में बनाई गई हैं और WrapPanel के बच्चों के रूप में जोड़ा है के साथ या ScrollViewer

हम एक स्क्रॉलबार से पता चला की जरूरत है, हम ScrollViewer लाने के लिए है? स्क्रॉलव्यूयर के बिना कोई रास्ता नहीं है? क्या मैं प्राप्त करना चाहते हैं क्योंकि WrapPanel छोटे आकार की है, मैं एक स्क्रॉलबार केवल आवश्यकता (बच्चों का पूरा) की तरह प्रदर्शित करना चाहते हैं है।

मेरे कोड के नीचे के रूप में सरल है (ग्रिड के अंदर WrapPanel और ग्रिड TabControl के अंदर है) अपने उत्कृष्ट प्रदर्शन के लिए

बहुत धन्यवाद हमेशा।

अद्यतन: मैंने कई दिनों तक इंटरनेट पर समाधान खोजने में संघर्ष किया। और मैंने ScrollViewer के अंदर WrapPanel डालने की कोशिश की। हालांकि, हालांकि मैं ऑटो के लिए VerticalScroll सेट, ऊर्ध्वाधर स्क्रॉलबार हमेशा दिखाई देता है WrapPanel किसी भी बच्चों को नहीं है, तब भी जब।

इसके अलावा, जब मैं जानबूझकर WrapPanel बच्चों (बटन) से भरा बनाने के लिए, ScrollViewer के ऊर्ध्वाधर स्क्रॉलबार scrolldown उपलब्धता प्रदान नहीं करता है। और WrapPanel का लब्बोलुआब पर बटन कटौती दिखाया गया है और अधिक, मैं जमीनी स्तर पर बटन से आगे देखने के लिए नीचे स्क्रॉल नहीं कर सकते। मैंने बटन को जानबूझकर रैपपनेल की निचली पंक्ति से परे रखा था।

या बिना, मैं केवल लंबवत स्क्रॉलबार को दिखाना चाहता हूं जब केवल आवश्यक (बच्चों से भरा)। ऐसा करना बहुत आसान लगता है। लेकिन इसे ठीक से काम करना मुश्किल है।

समाधान: श्री हेंक Holterman द्वारा प्रदान किया गया

    <DropShadowEffect/> 
       </Button.Effect> 
      </Button> 
      <WrapPanel x:Name="WrapPanelGreen" HorizontalAlignment="Left" Height="180" VerticalAlignment="Top" Width="232" UseLayoutRounding="True" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"/> 
     </Grid> 
    </TabItem> 
</TabControl> 

और नीचे मेरी सरल कोड है जो प्रोग्राम के रूप में बटन बनाने के लिए और WrapPanel के एक बच्चे के रूप में जोड़ सकते हैं।

for (int k = 0; k < Overviews.Length; k++) 
{ 
    Button btnoverviewcontent = new Button(); 

    ToolTip tt = new ToolTip(); 
    tt.Content = "Press this button if you want to modify or delete."; 
    btnoverviewcontent.ToolTip = tt; 

    btnoverviewcontent.Cursor = Cursors.Hand; 

    SolidColorBrush mySolidColorBrush = new SolidColorBrush(); 
    mySolidColorBrush.Color = Color.FromArgb(255, 101, 173, 241); 
    btnoverviewcontent.Background = mySolidColorBrush; 

    btnoverviewcontent.Effect = new DropShadowEffect 
    { 
     Color = new Color { A = 255, R = 0, G = 0, B = 0 }, 
     Direction = 315, 
     ShadowDepth = 5, 
     Opacity = 1 
    }; 

    btnoverviewcontent.Padding = new Thickness(3, 3, 3, 3); 
    btnoverviewcontent.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch; 
    TextBlock textBlock = new TextBlock() 
    { 
     Text = Overviews[k], 
     TextAlignment = TextAlignment.Left, 
     TextWrapping = TextWrapping.Wrap, 

    }; 

    btnoverviewcontent.Content = textBlock; 
    btnoverviewcontent.BorderThickness = new Thickness(0, 0, 0, 0); 
    btnoverviewcontent.FontStretch = FontStretches.UltraExpanded; 
    btnoverviewcontent.Margin = new Thickness(5, 5, 5, 5); 

    WrapPanelGreen.Children.Add(btnoverviewcontent); 
    btnoverviewcontent.Click += new RoutedEventHandler(OnOverviewClick); 
+0

मैं तुम्हें करने के लिए प्रत्यक्ष जाएगा: http://stackoverflow.com/a


तत्वों की एक गतिशील संख्या के साथ यह पूरा उदाहरण देखें/2119243/1723823 यह स्क्रैपिंग को कार्यान्वित करने के तरीके पर कुछ टिप्पणियों के साथ WrapPanel के मूल कार्य का एक अच्छा टूटना है। – TernaryTopiary

+0

@ हेनकहोल्टरमैन, कृपया मेरा अद्यतन प्रश्न देखें। आपकी बहुमूल्य टिप्पणी के लिए धन्यवाद। –

+0

@ टर्नरी टोपीरी, आपकी दिशा के लिए बहुत धन्यवाद। हालांकि, मैंने लिंक किए गए पृष्ठ का मूल्यांकन किया और इस समय पूरी तरह से फिर से। मेरी समस्या है बच्चे (बटन) प्रोग्रामेटिक रूप से बनाए जाते हैं और बच्चों की आकार उनकी टेक्स्ट सामग्री के अनुसार अलग होती है। इसलिए, मैं दूसरा समाधान अपनाने नहीं कर सकता .. कृपया मेरा अद्यतन प्रश्न देखें। –

उत्तर

10

WPF में विचार हर घटक केवल अपने स्वयं के काम किया है और यदि आप कुछ व्यवहार चाहते हैं, आप को देखने के लिए आप देख रहे हैं बनाने के लिए कई घटकों गठबंधन।

इसका मतलब है कि पैनल के लिए स्क्रॉल बार प्राप्त करने के लिए, आपको इसे ScrollViewer घटक में लपेटना होगा। यह ScrollViewer का उद्देश्य है और यह हल करने के लिए यह एकमात्र (साधु) समाधान है।


हालांकि, हालांकि मैं ऑटो के लिए verticalscroll निर्धारित करते हैं, verticalscrollbar हमेशा दिखाई देता है तब भी जब Wrappanel किसी भी बच्चे नहीं है [...]

तो फिर तुम ज़रिये जुड़े हुए हैं ScrollViewer गलत तरीके से, या गलत तत्व लपेटना। यह इस तरह दिखना चाहिए:

<ScrollViewer VerticalScrollBarVisibility="Auto"> 
    <WrapPanel> 
     <!-- Any number of components here --> 
    </WrapPanel> 
</ScrollViewer> 

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

ध्यान दें कि ScrollViewer को मूल तत्व में उचित आयाम होने की आवश्यकता है, इसलिए सुनिश्चित करें कि यह दृश्य क्षेत्र से बड़ा नहीं है। ऑटो चौड़ाई और ऊंचाइयों के लिए WrapPanel (या ScrollViewer के साथ जो भी अन्य तत्व आप लपेटते हैं) के लिए भी आवश्यक है। अन्यथा, निश्चित आयामों के साथ, पैनल की सामग्री को संशोधित करते समय पैनल के आयाम बदले नहीं जाएंगे और इस तरह स्क्रॉलिंग स्थिति बदलेगी नहीं।

<Window x:Class="WpfExampleApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="300" Width="200"> 
    <ScrollViewer VerticalScrollBarVisibility="Auto"> 
     <WrapPanel Name="panel"> 
      <Button Click="Button_Click">Add child</Button> 
     </WrapPanel> 
    </ScrollViewer> 
</Window> 

कोड-पीछे:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Label element = new Label() { Content = "This is some example content" }; 
     panel.Children.Add(element); 
    } 
} 
+0

मैं यह इंगित करने जा रहा था कि रैपपैनल में पहले से ही स्क्रॉलव्यूयर घटक है, लेकिन मेरे पास विजुअल स्टूडियो में एक नाटक था और यह निष्कर्ष निकाला कि भले ही आप इसे स्क्रॉल व्यूअर को हर समय दिखाने के लिए मजबूर करते हैं (WrapPanel के माध्यम से एक्सएएमएल टैग: 'ScrollViewer.VerticalScrollBarVisibility = "Visible" ', यह वास्तव में अंतिम उपयोगकर्ता के लिए स्क्रॉलिंग की पेशकश नहीं करता है। मैं इस उत्तर से सहमत हूं। – TernaryTopiary

+1

@TernaryTopiary संलग्न संपत्ति' ScrollViewer.VerticalScrollBarVisibility' प्रत्येक घटक से जुड़ी हो सकती है लेकिन नियंत्रणों के लिए केवल एक प्रभाव है जिसमें वास्तव में एक स्क्रॉल बार होता है (उदाहरण के लिए 'सूची दृश्य)। सामान्य रूप से पैनलों में कोई स्क्रॉल कार्यक्षमता शामिल नहीं होती है बल्कि केवल विभिन्न लेआउटिंग क्षमताओं की पेशकश करती है, इसलिए उन्हें हमेशा' स्क्रॉलव्यूअर 'के अंदर लपेटना होगा। – poke

+0

@ पोक, मैं वास्तव में आपके बहुमूल्य उत्तर की सराहना करता हूं। मैंने आपके सुझाव की तरह लपेटने की भी कोशिश की लेकिन जैसा कि मैंने अपडेट किया, बच्चों को प्रोग्रामेटिक रूप से बनाया गया और Wrappanel के एक बच्चे के रूप में सेट। क्या यह आपके सुझाव से अलग है? मेरी स्क्रॉलबार तब भी दिखती है जब इसकी आवश्यकता नहीं होती है और जब इसकी आवश्यकता होती है तो काम नहीं करता .. ओह..भगवान..मैंने कई दिनों तक समाधान खोजने की कोशिश की और आखिर में स्टैक ओवरफ्लो से पूछने की कोशिश की ... –

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