2012-01-01 5 views
6

मैं इस है:अभिभावकीय नियंत्रण ScrollViewer बच्चे नियंत्रण के बजाय स्क्रॉल ScrollViewer

<Window x:Class="ScrollTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Height="450" 
     Width="525"> 
    <ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Visible" 
        ScrollViewer.VerticalScrollBarVisibility="Visible"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 

      <GroupBox Grid.Row="0" 
         Header="Stuff" 
         Height="200"> 
       <TextBlock Text="Lots of controls go here" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center" /> 
      </GroupBox> 
      <TabControl Grid.Row="1"> 
       <TabItem Header="Main Tab"> 
        <TextBox MinHeight="100" 
          HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch" 
          HorizontalContentAlignment="Left" 
          VerticalContentAlignment="Top" 
          ScrollViewer.HorizontalScrollBarVisibility="Visible" 
          ScrollViewer.VerticalScrollBarVisibility="Visible" 
          AcceptsReturn="True" /> 
       </TabItem> 
      </TabControl> 
     </Grid> 
    </ScrollViewer> 
</Window> 

जब मैं TextBox में बहुत अधिक पंक्तियाँ जोड़ने के लिए, TextBox की ScrollViewer के बजाय प्रयोग किया जा रहा, बॉक्स हिस्सों और सबसे बाहरी ScrollViewer प्रयोग किया जाता है। क्या मैं इसे TextBox या TabControl की ऊंचाई को ठीक किए बिना रोक सकता हूं?

अद्यतन:

MinHeight removed and MaxLines set to 5

अगर मैं एक 6 रेखा, स्क्रॉल बार कहा:

अगर मैं TextBox पर MinHeight को दूर करने के लिए और 5 MaxLines निर्धारित करते हैं, यह मैं क्या मिलता है TextBox के ScrollViewer का उपयोग किया जाता है, लेकिन वे अभी भी TextBox नियंत्रण में लंबवत केंद्रित रहते हैं।

उत्तर

1

मैं इस के साथ निकट प्राप्त करने में सक्षम था:

<Window x:Class="ScrollTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Width="525"> 
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Visible" 
        x:Name="Base"> 
     <Grid Height="{Binding ElementName=Base, Path=ActualHeight, Mode=OneWay}" 
       MinHeight="400"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 

      <GroupBox Grid.Row="0" 
         Header="Stuff" 
         Height="200"> 
       <TextBlock Text="Lots of controls go here" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center" /> 
      </GroupBox> 
      <TabControl Grid.Row="1"> 
       <TabItem Header="Main Tab"> 
        <Grid x:Name="myInnerGrid"> 
         <TextBox MinHeight="100" 
           MaxHeight="{Binding ElementName=myInnerGrid, Path=ActualHeight, Mode=OneWay}" 
           HorizontalAlignment="Stretch" 
           VerticalAlignment="Stretch" 
           HorizontalContentAlignment="Left" 
           VerticalContentAlignment="Top" 
           ScrollViewer.HorizontalScrollBarVisibility="Visible" 
           ScrollViewer.VerticalScrollBarVisibility="Visible" 
           AcceptsReturn="True" /> 
        </Grid> 
       </TabItem> 
      </TabControl> 
     </Grid> 
    </ScrollViewer> 
</Window> 

नोट बाध्यकारी TextBox के लिए बाहर ग्रिड के लिए ऊंचाई पर अभिव्यक्ति और MaxHeight पर।

यह अभी भी सही नहीं है कि आपको MinHeight मैन्युअल रूप से सेट करना होगा जो बाहरी अधिकांश स्क्रॉलबार को ट्रिगर करेगा। यह शायद करीब है क्योंकि डब्ल्यूपीएफ एक नया ग्रिड नियंत्रण लिखने के बिना अनुमति देगा।

विचार यहाँ पाया गया था: http://social.msdn.microsoft.com/Forums/en/wpf/thread/7b4b0c88-6b8f-4f07-aa8b-8e7018762388

1

MaxLines और MinLines गुणों को देखने का प्रयास करें।

ऊपर दी गई लिंक से:

इस गुण को सेट आकार बदलने के लिए करता है, तो दृश्य लाइनों की संख्या सीमा Maxlines द्वारा निर्दिष्ट से अधिक पाठ बॉक्स का कारण बनता है। यह संपत्ति केवल दृश्यमान लाइनों पर लागू होती है, और वास्तविक लाइनों की संख्या को बाधित नहीं करती है। इसकी कॉन्फ़िगरेशन के आधार पर, एक टेक्स्ट बॉक्स में स्क्रॉलिंग द्वारा उपलब्ध अतिरिक्त गैर-दृश्यमान लाइनें हो सकती हैं। यदि ऊँचाई संपत्ति स्पष्ट रूप से टेक्स्टबॉक्स पर सेट की गई है, तो मैक्सलाइन और मिनीलाइन संपत्ति मानों को अनदेखा कर दिया जाता है।

कोशिश बदलने:

<TextBox MinHeight="100" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" 
     ... 

को
<TextBox MinLines="5" 
     MaxLines="5" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" 

संपादित करें: इस आज़मा कर देखें। यह TabItem के VerticalContentAlignment को सेट कर रहा है। यह Tab के शीर्ष पर टेक्स्ट बॉक्स रखेगा, यदि आप अपना फॉर्म आकार बदलते हैं तो आप अधिकतम संख्या को भी सेट कर सकते हैं यदि आप अपने फॉर्म का आकार बदल सकते हैं तो आप सभी उपलब्ध स्थान का उपयोग करने के लिए उस नंबर को समायोजित करना चाहते हैं।

<TabItem Header="Main Tab" VerticalContentAlignment="Top" > 
    <TextBox 
       ScrollViewer.HorizontalScrollBarVisibility="Visible" 
       ScrollViewer.VerticalScrollBarVisibility="Visible" 
       MinLines="8" 
       MaxLines="8" 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Stretch" 
       HorizontalContentAlignment="Stretch" 
       VerticalContentAlignment="Stretch" 
       AcceptsReturn="True" /> 
</TabItem> 

संपादित करें:

इसे में आगे देखने के बाद, कारण स्क्रॉलबार TextBox पर दिखाई नहीं दे रहे है, क्योंकि TabControl और TabItemTextBox के आकार के आकार बदलने कर रहे हैं। क्या करने की आवश्यकता है TabControl, TabItem या TextBox पर सीमित ऊंचाई सेट करने के लिए यह TextBox के लिए ScrollViewer पर काम करने की अनुमति देगा।

+0

अच्छा विचार, लेकिन इसका कोई प्रभाव नहीं पड़ा। – mbursill

+0

@mbursill क्या यह ऊंचाई को सीमित करता है? यह आपके द्वारा निर्धारित मूल्य तक लाइनों की संख्या में बढ़ना चाहिए। –

+0

नहीं। मैंने मैक्सलाइन को 5 पर सेट करने का प्रयास किया, और जब मैंने 5 लाइनों को पार किया, तो कुछ अलग नहीं हुआ। जब मैं 9 लाइनों तक पहुंचता हूं (यदि मैंने अपने उदाहरण के 450 से अधिक विंडो का आकार नहीं बदला है) टेक्स्टबॉक्स बॉक्स लंबवत रूप से विस्तार करना शुरू कर देता है, जिससे बाहरी स्क्रॉल-व्यूअर लंबवत स्क्रोल करने योग्य होता है। टेक्स्टबॉक्स के स्क्रॉल बार का कभी भी उपयोग नहीं किया जाता है। – mbursill

0

मैंने पाया कि यह करने के लिए सबसे अच्छा समाधान Border चाल here उल्लिखित उपयोग करने के लिए है, दोनों अनुलंब और क्षैतिज लागू होता है।

निम्न उदाहरण में, एक ScrollViewer एक TextBox, जहां यह TextBox के लिए वांछित है शामिल उपलब्ध स्थान (अनुलंब और क्षैतिज) के सभी फिट है, और यह माता पिता ScrollViewer से पहले खड़ी स्क्रॉल है। BorderPlaceHolderBorderTextBox es के Width का प्रबंधन करता है क्योंकि मूल विंडो का आकार बदलता है। BorderDescriptionPlaceHolderBorderDescriptionTextBox के Height का प्रबंधन करता है क्योंकि अभिभावक नियंत्रण का आकार बदलता है, और TextBox के ScrollViewer माता-पिता नियंत्रण से पहले किक करता है।

प्लेसहोल्डर Border एस में Margin एस होना महत्वपूर्ण है।

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Background="{StaticResource ControlBackgroundBrush}"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="10"></ColumnDefinition> 
      <ColumnDefinition Width="Auto"></ColumnDefinition> 
      <ColumnDefinition Width="*"></ColumnDefinition> 
      <ColumnDefinition Width="10"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Label Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" Style="{DynamicResource LabelHeader}" Content="Company" /> 
     <Label Grid.Row="1" Grid.Column="1" Style="{DynamicResource CompanyNameInput}" Content="{Binding CompanyNameLabel}" /> 
     <Label Grid.Row="2" Grid.Column="1" Style="{DynamicResource DescriptionInput}" Content="{Binding DescriptionLabel}" /> 
     <Border Name="PlaceHolderBorder" Grid.Column="2" Margin="7"/> 
     <TextBox Grid.Row="1" Grid.Column="2" Text="{Binding CompanyName}" MaxLength="255"/> 
     <Border Name="DescriptionPlaceHolderBorder" Grid.Row="2" Margin="7"/> 
     <TextBox Grid.Row="2" Grid.Column="2" Text="{Binding Description}" VerticalScrollBarVisibility="Auto" 
       TextAlignment="Left" TextWrapping="Wrap" AcceptsReturn="True" MinHeight="60" 
       Width="{Binding ElementName=PlaceHolderBorder, Path=ActualWidth}" 
       Height="{Binding ElementName=DescriptionPlaceHolderBorder, Path=ActualHeight}" 
     /> 
     <StackPanel Orientation="Horizontal" Grid.Row="3" Grid.Column="2" Margin="5"> 
      <Button Command="{Binding UpdateCommand}" Content="{Binding UpdateButtonLabel}"></Button> 
      <Button Command="{Binding ResetCommand}" Content="{Binding ResetButtonLabel}"></Button> 
      <Button Command="{Binding CloseConfirmCommand}" Content="{Binding CloseButtonLabel}"></Button> 
     </StackPanel> 
    </Grid> 
</ScrollViewer> 
संबंधित मुद्दे