2012-01-01 58 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,而不是TextBoxScrollViewer使用,箱體延伸和最外層ScrollViewer用來。如果不固定TextBoxTabControl的高度,我可以預防這種情況嗎?

更新:

如果我在TextBox刪除MinHeight並設置MaxLines 5,這是我得到:

MinHeight removed and MaxLines set to 5

如果我加了一個6號線,滾動條的TextBoxScrollViewer被使用,但它們仍然保持在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。這可能與WPF在不編寫新的網格控件時所允許的接近。

當時的想法是在這裏找到: http://social.msdn.microsoft.com/Forums/en/wpf/thread/7b4b0c88-6b8f-4f07-aa8b-8e7018762388

1

試試看MaxLinesMinLines屬性。

從上面的鏈接:

設置該屬性將導致文本框如果 可視行數超過MAXLINES指定的限制來調整。此屬性 僅適用於可見行,並且不限制實際的行數 。根據其配置,文本框可能包含其他不可見的滾動條可訪問的行。 如果在TextBox上顯式設置Height屬性,則忽略MaxLines 和MinLines屬性值。

嘗試改變:

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

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

編輯:試試這個。它設置TabItemVerticalContentAlignment。這將使文本框保持在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起來的原因是因爲TabControlTabItem被調整到TextBox的大小。需要做的是在TabControl,TabItemTextBox上設置限制高度,這將允許ScrollViewer適用於TextBox

+0

好主意,但它沒有影響。 – mbursill 2012-01-02 00:35:13

+0

@mbursill它有沒有限制高度?它應該增加行數,直到您設置的值。 – 2012-01-02 00:36:00

+0

沒有。我試着將MaxLines設置爲5,當我超過5行時,沒有什麼不同。當我達到9行(如果我沒有調整窗口的大小超過我的例子的450),TextBox框開始垂直擴展,導致最外面的滾動查看器可以垂直滾動。 TextBox的滾動條從不使用。 – mbursill 2012-01-02 00:39:22

0

我發現,這個最好的解決方案是使用概述hereBorder伎倆,垂直和水平兩種應用。

在以下示例中,一個ScrollViewer包含TextBox,其中希望具有TextBox適合所有可用空間(垂直和水平)的,並有它的父ScrollViewer前垂直滾動。當父窗口調整大小時,BorderPlaceHolderBorder管理TextBox es的Width。當父控件調整大小並且TextBoxScrollViewer在父控件之前開始時,BorderDescriptionPlaceHolderBorder管理的DescriptionTextBox

在佔位符Border s中有Margin s很重要。

<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> 
相關問題