2010-12-23 6 views
20

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

<UserControl x:Class="BusinessObjectCreationWizard.View.TableSelectionPageView" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <GroupBox FontWeight="Bold" Height="300px" 
       Header="Tables" 
       Padding="2"> 

     <ScrollViewer> 

      <ItemsControl FontWeight="Normal" 
          ItemsSource="{Binding Path=AvailableTables}"> 
       <ItemsControl.ItemTemplate> 

        <DataTemplate>    
         <CheckBox Content="{Binding Path=DisplayName}" 
            IsChecked="{Binding Path=IsSelected}" 
            Margin="2,3.5" /> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </ScrollViewer> 
    </GroupBox> 
</UserControl> 

इस उपयोगकर्ता नियंत्रण यहाँ

<Border Background="White" Grid.Column="1" Grid.Row="0"> 
     <HeaderedContentControl Content="{Binding Path=CurrentPage}" 
           Header="{Binding Path=CurrentPage.DisplayName}" /> 
</Border> 

मैं भरी हुई है जाएगा ऊँचाई निर्दिष्ट नहीं चाहते।

+0

ग्रिड का विस्तार इस बात पर निर्भर करता है कि इसमें क्या शामिल है। सटीक उत्तर प्राप्त करने के लिए आपको अपने XAML को अधिक दिखाने की आवश्यकता है। –

+0

मैंने अतिरिक्त कोड जोड़ा (हालांकि फॉर्मेटिंग अजीब आया) –

उत्तर

25

यदि आप अपने ग्रुपबॉक्स (जो, जहां तक ​​मैं समझता हूं, वह है जो आप करना चाहते हैं) से ऊंचाई हटाते हैं, तो यह उसके कंटेनर को भर देगा, जब तक कोई पैनल अपस्ट्रीम न हो जो अपने आकार के नियम लगाए।

मैं अपने XAML के इस सरलीकृत संस्करण का इस्तेमाल किया। इस टेम्पलेट को अकेले बनाने के लिए मैंने टेम्पलेट और बाइंडिंग को हटा दिया, और कड़ी-कोड की कुछ वस्तुओं को हटा दिया; वे परिवर्तन लेआउट के तरीके को प्रभावित नहीं करेंगे।

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <GroupBox FontWeight="Bold" Header="Tables" Padding="2"> 
     <ScrollViewer> 
      <ItemsControl FontWeight="Normal"> 
       <TextBlock>Foo</TextBlock> 
       <TextBlock>Bar</TextBlock> 
       <TextBlock>Baz</TextBlock> 
      </ItemsControl> 
     </ScrollViewer> 
    </GroupBox> 
</Window> 

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

तो समस्या सबसे अधिक संभावना माता पिता पैनल में से एक, एक आप अपने नमूना XAML में दिखाई नहीं दे रहे हैं।

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <StackPanel> 
     <GroupBox FontWeight="Bold" Header="Tables" Padding="2"> 
      <ScrollViewer> 
       <ItemsControl FontWeight="Normal"> 
        <TextBlock>Foo</TextBlock> 
        <TextBlock>Bar</TextBlock> 
        <TextBlock>Baz</TextBlock> 
       </ItemsControl> 
      </ScrollViewer> 
     </GroupBox> 
    </StackPanel> 
</Window> 

अब GroupBox विंडो के ऊपरी भाग, वास्तव में इसकी सामग्री फिट करने के लिए आकार में दिखाई देता है: अपने GroupBox एक StackPanel अंदर प्रदर्शित होता है या समस्या आप का वर्णन हो सकता है। यदि आप खिड़की को पर्याप्त रूप से छोटा करते हैं, तो ग्रुपबॉक्स काट दिया जाएगा - क्योंकि इसका आकार इसके कंटेनर में फिट नहीं है। यह आपके द्वारा वर्णित समस्या की तरह लगता है।

कारण यह है कि StackPanel अपने बच्चों क्या उनके आदर्श ऊंचाई (उनकी सामग्री के आधार पर) है पूछता है, और कहा कि ऊंचाई का उपयोग करता है। StackPanel (या कुछ इसी तरह) के बिना, डिफ़ॉल्ट नियंत्रण के VerticalAlignment सम्मान करने के लिए है, और है कि अगर खिंचाव के डिफ़ॉल्ट मान पर सेट है, तो नियंत्रण अपनी मूल को भरने के लिए बढ़ाया गया है। इसका मतलब है कि यह अपने माता-पिता से लंबा नहीं होगा, जो आप चाहते हैं की तरह लगता है।

समाधान: स्टैकपैनल को हटाएं (या जो भी आपको समस्याएं पैदा कर रहा है) और कुछ और उपयोग करें। जो आप पूरा करने की कोशिश कर रहे हैं उसके आधार पर, आपको डॉकपैनल या ग्रिड के साथ बेहतर भाग्य हो सकता है। अपने लेआउट के बारे में और जानने के बिना बताना मुश्किल है।

संपादित करें: ठीक है, ऐसा लगता है कि समस्या वास्तव में HeaderedContentControl माता-पिता है - लेकिन सीधे नहीं। HeaderedContentControl एक पैनल नहीं है, इसलिए यह अपने स्वयं के किसी भी लेआउट नहीं करता है (और इसके वंशज, ग्रुपबॉक्स में, यह वही समस्या नहीं है)। समस्या इसका डिफ़ॉल्ट टेम्पलेट है - जिसमें एक स्टैकपैनल शामिल है। अच्छी खबर यह है कि आप एक अलग टेम्पलेट का उपयोग करने के लिए स्वतंत्र हैं, के बजाय एक DockPanel के साथ एक कहना है:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <HeaderedContentControl> 
    <HeaderedContentControl.Style> 
     <Style TargetType="{x:Type HeaderedContentControl}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
      <ControlTemplate TargetType="{x:Type HeaderedContentControl}"> 
       <DockPanel> 
       <ContentPresenter ContentSource="Header" DockPanel.Dock="Top"/> 
       <ContentPresenter/> 
       </DockPanel> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </HeaderedContentControl.Style> 
    <GroupBox FontWeight="Bold" Header="Tables" Padding="2"> 
     <ScrollViewer> 
     <ItemsControl FontWeight="Normal"> 
      <TextBlock>Foo</TextBlock> 
      <TextBlock>Bar</TextBlock> 
      <TextBlock>Baz</TextBlock> 
     </ItemsControl> 
     </ScrollViewer> 
    </GroupBox> 
    </HeaderedContentControl> 
</Window> 

आप <HeaderedContentControl.Style> हिस्सा छोड़ देते हैं तो आपकी समस्या reproduces; लेकिन शैली के साथ, यह ग्रुपबॉक्स को अपने कंटेनर को भरने की इजाजत देता है, इसलिए जब आप इसे चाहते हैं तो स्क्रॉलव्यूयर को स्क्रॉलबार मिलेगा।

+0

ग्रुपबॉक्स के माता-पिता (उपयोगकर्ता नियंत्रण के बगल में) एक headeredcontentcontrol है। जब भी मैं स्पष्ट रूप से इसके आकार को सीमित करता हूं तब भी मुझे समस्या है। लेकिन आपकी व्याख्या सबसे अच्छी थी। समय लेने के लिए शुक्रिया। –

+0

अद्यतन के लिए धन्यवाद। वह चाल है। मुझे कुछ अन्य बदलाव करना पड़ा क्योंकि स्टैकपैनल को अन्य प्रभावों को हटा दिया गया था। –

0

पूरी तरह से ग्रिड को दूर करने और GroupBox पर सीधे HorizontalAlignment और VerticalAlignment सेट करके देखें। यदि एक लेआउट पैनेल में केवल एक बच्चा है, तो यह अक्सर अनावश्यक है ... यह माइग आपके मामले में सच है।

यदि वह काम नहीं करता है ... क्या आपके ग्रिड नियंत्रण के माता पिता है?

+0

ग्रिड को हटाने से कुछ भी नहीं बदला (लेकिन मैंने इसे अभी भी हटा दिया क्योंकि यह अनावश्यक था)। ग्रिड का अभिभावक एक उपयोगकर्ता नियंत्रण है, जिसे हेड्रेड कंटेंट कंट्रोल की सामग्री के रूप में लोड किया जाता है। मैंने यह देखने के लिए अस्थायी रूप से हेडेड कंटेंट कंट्रोल की ऊंचाई सीमित कर दी है कि वह विस्तार कर रहा था लेकिन इससे इस मुद्दे को हल नहीं किया गया था। मैंने बिना किसी सफलता के 'सॉफ्टवेयरक्वॉस्टियोनर' सुझाव का भी प्रयास किया। –

9

यदि पिछला उत्तर समस्या को ठीक नहीं करता है, तो आप अपने ग्रिड की चौड़ाई, वास्तविक विड्थ की वास्तविकता को बाध्य करने का प्रयास कर सकते हैं, आपके मूल उपयोगकर्ता नियंत्रण की वास्तविक हाइट। कुछ की तरह:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="WpfApplication.UserControl1" 
x:Name="UserControl"> 
<Grid Height="{Binding ElementName=UserControl, Path=ActualHeight}" 
     Width="{Binding ElementName=UserControl, Path=ActualWidth}" /> 

इस मामले में आप एक स्पष्ट चौड़ाई और ऊंचाई सेट कर रहे हैं नहीं, लेकिन आप ग्रिड चौड़ाई/ऊंचाई UserControl यह में बैठता है की कमी के सीमित कर रहे हैं

0

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

2

इस प्रतिक्रिया को पढ़ने के बाद, मेरे पास एक ही समस्या थी, मैंने सभी StackPanels को UserControl में ग्रिड के साथ बदल दिया। इसने स्क्रॉलबार मुद्दे को हल किया।

0

वे अलग हैं। यदि आप आइटम को चुनने योग्य नहीं करना चाहते हैं, तो ListBox का उपयोग न करें। यह भारी होने वाला है, और हर बार जब उपयोगकर्ता प्रवेश पर क्लिक करता है तो चयन को अचयनित कर देगा। बस ScrollViewer

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