2009-07-15 11 views
26

में स्क्रॉल नहीं कर रहा है, मैं अपने स्टैक पैनल के चारों ओर एक स्क्रॉलव्यूयर नियंत्रण का उपयोग कर रहा हूं जिसमें आइटम नियंत्रण शामिल है। जब आइटम्स कंट्रोल में कई आइटम होते हैं तो स्क्रॉल करना लगता है लेकिन किसी कारण से यह केवल आइटमों में कटौती करता है।स्क्रॉलवियर WPF

<StackPanel> 
    <ScrollViewer CanContentScroll="True" VerticalScrollBarVisibility="Visible"> 
     <ItemsControl Name="icEvents" Width="Auto" Height="100" Background="AliceBlue" 
         ItemsSource="{Binding Path=EventSources}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="Source:"/> 
         <TextBlock Text="{Binding Path=Source}" /> 
         <TextBlock Text="Original Source:"/> 
         <TextBlock Text="{Binding Path=OriginalSource}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

उत्तर

40

अपने ScrollViwer बजाय StackPanel के चारों ओर एक ग्रिड की कोशिश करो। मुझे लगता है कि StackPanel आंतरिक सामग्री के रूप में ज्यादा ऊंचाई प्रदान करेगा, इसलिए Scrollviwer ठीक से काम नहीं करता है क्योंकि इसकी ऊंचाई उसके मूल नियंत्रण से प्रतिबंधित नहीं है।

आप नीचे दिए गए उदाहरण से समस्या को समझ सकते हैं।

<StackPanel> 
    <ScrollViewer> 
     <ItemsControl > 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

उपरोक्त कोड आपके जैसा ही है और यह आपको स्क्रॉलबार नहीं देता है। लेकिन नीचे दिए गए कोड है, जिसमें मैं केवल एक Grid करने के लिए StackPanel बदला है यह देखने (कोई भी पैनल जो पैनल आकार के आधार पर अपने बच्चों के आकार का सम्मान करता है लेकिन StackPanel नहीं है)

<Grid> 
    <ScrollViewer> 
     <ItemsControl > 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     </ItemsControl> 
    </ScrollViewer> 
</Grid> 

अद्यतन: यदि आपको वास्तव में StackPanel उपयोग करने के लिए तो आप अपने ScrollViwer के लिए आकार निर्धारित करने की आवश्यकता हो सकती है सामग्री स्क्रॉल

+0

यह संभव नहीं है क्योंकि सबकुछ StackPanel के अंदर है। पेज पर कोई ग्रिड नहीं है। केवल मास्टर स्टैकपैनल जिसमें दो अन्य स्टैकपैन शामिल हैं। यह तब भी होता है जब मैं स्टैकपैन की ऊंचाई 100 की तरह कहता हूं। – azamsharp

+0

समस्या यह है कि विंडो पर हर नियंत्रण मास्टर स्टैक पैनल नियंत्रण में निहित है। azamsharp

+2

लेकिन तब आप क्योंकि जैसा कि मैंने पहले कहा एक StackPanel does not को अपने बच्चों के ऊंचाई सम्मान या, आकार निर्धारित करने के लिए अपने ScrollViwer सामग्री पुस्तक प्राप्त करने के लिए आवश्यकता हो सकती है यदि आप वास्तव में StackPanel उपयोग करने की आवश्यकता चौड़ाई। इसलिए जब हम StackPanel –

2

ItemsControlScrollViewer, चारों ओर नहीं अन्य तरीके से शामिल करना चाहिए: यहाँ कोड है। ScrollViewer यह सब आपके मामले में ItemsControl के बारे में जानता है - यह आंतरिक वस्तुओं के बारे में नहीं जानता है। इस तरह

कोशिश कुछ:

<ItemsControl Name="icEvents" Width="Auto" Height="100" 
    Background="AliceBlue" 
    ItemsSource="{Binding Path=EventSources}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="Source:"/> 
       <TextBlock Text="{Binding Path=Source}" /> 
       <TextBlock Text="Original Source:"/> 
       <TextBlock Text="{Binding Path=OriginalSource}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.Template> 
     <ControlTemplate TargetType="ItemsControl"> 
      <ScrollViewer VerticalScrollBarVisibility="Auto"> 
       <ItemsPresenter Margin="5" /> 
      </ScrollViewer> 
     </ControlTemplate> 
    </ItemsControl.Template> 
</ItemsControl> 
+0

यह एक scrollviwer के लिए आवश्यक नहीं है, प्रश्न में समस्या StackPanel है। –

+1

आपको कहीं स्क्रॉल व्यूअर की आवश्यकता है, हालांकि, डिफ़ॉल्ट रूप से आइटम्स कंट्रोल स्क्रॉल नहीं करता है। मैंने इस कोड का उपयोग किया है और यह काम करता है, हालांकि आपका जवाब शायद काम भी करेगा। – Andy

+0

हाँ आपका कोड केवल तभी काम करता है जब वह बाहरी स्टैकपैनल को हटा देता है और इससे कोई फर्क नहीं पड़ता कि आपके पास ControlTemplate के अंदर स्क्रॉलबार है या आइटम्स कंट्रोल के बाहर दोनों समान हैं। –

21

आप ScrollViewer की ऊंचाई को ठीक करना होगा प्राप्त करने की आवश्यकता है, लेकिन आसानी StackPanel ActualHeight करने के लिए बाध्य कर सकते हैं:
(परीक्षण किया कोड)

+०१२३५१६४१०६१
<StackPanel Name="mypanel"> 
    <ScrollViewer Height="{Binding ElementName=mypanel, Path=ActualHeight}"> 
     <ItemsControl> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

या बेहतर अभी तक, अगर आप StackPanel का नाम नहीं बदल सकते हैं:

<StackPanel> 
    <ScrollViewer Height="{Binding RelativeSource={RelativeSource FindAncestor, 
         AncestorType={x:Type StackPanel}}, Path=ActualHeight}"> 
     <ItemsControl> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

यह एक "आप पहले" समस्या है, StackPanel ऊंचाई के लिए ScrollViewer और ScrollViewer पूछना पूछना अधिकतम ऊंचाई के लिए StackPanel यह हो सकता है।

+2

ऐसे सूचनात्मक उत्तर के लिए धन्यवाद! यह निश्चित रूप से काम में आ जाएगा! – azamsharp

+0

बहुत बढ़िया जवाब, एक आकर्षण की तरह काम किया! – Jlange

0

स्क्रॉल को आकार बदलने वाले बच्चे के माता-पिता होने की आवश्यकता है, इसलिए आकार बदलने (इस उदाहरण में स्टैक पैनल) को इसके अंदर रखें।

<ScrollViewer> 
    <StackPanel> 
     <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
     <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
     <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
    </StackPanel> 

0

मैं एक समस्या है जिससे मैं एक ग्रिड में और व्यवस्था स्क्रॉलबार को देखने के लिए एक ItemsControl से पता चला था, मैं इस ग्रिड सेल * आकार के ऊंचाई देने के लिए किया था।

हालांकि, इसका मतलब यह था कि ItemsControl केवल कुछ मान थे, तब भी सेल को भर दिया।

मैं ItemsControl चाहता था कि यह दिखाने के लिए केवल इतना बड़ा हो कि उसके पास क्या था लेकिन यदि उसके पास बहुत सारी चीज़ें थी तो मैं इसे स्क्रॉल करना चाहता था। शब्दों के क्रम में मैं चाहता था कि यह केवल किसी भी आकार की निगरानी करे।

लोडेड घटना में इस कोड को मेरे लिए काम किया:

Size x = new Size(double.PositiveInfinity, double.PositiveInfinity); 
myItemscontrol.Measure(x); 
संबंधित मुद्दे

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