2012-01-01 8 views
6

Tôi có điều này:Chánh ScrollViewer di chuyển thay vì kiểm soát con 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> 

Khi tôi thêm quá nhiều hàng vào TextBox, thay vì ScrollViewer của TextBox được sử dụng, trải dài hộp và ngoài cùng ScrollViewer Được sử dụng. Tôi có thể ngăn chặn điều đó mà không sửa chiều cao của TextBox hoặc TabControl không?

Cập nhật:

Nếu tôi loại bỏ MinHeight trên TextBox và thiết lập MaxLines-5, đây là những gì tôi nhận được:

MinHeight removed and MaxLines set to 5

Nếu tôi đã thêm một dòng 6, các thanh cuộn của TextBox 's ScrollViewer được sử dụng, nhưng chúng vẫn được giữ ở giữa theo chiều dọc trong điều khiển TextBox.

Trả lời

1

tôi đã có thể để có được gần gũi với điều này:

<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> 

Lưu ý các biểu hiện bắt buộc đối với chiều cao cho lưới điện bên ngoài và trên MaxHeight cho TextBox.

Vẫn chưa hoàn hảo vì bạn phải đặt thủ công MinHeight để kích hoạt thanh cuộn bên ngoài nhất. Nó có thể gần như WPF sẽ cho phép mà không cần viết một điều khiển lưới mới.

Ý tưởng này được tìm thấy ở đây: http://social.msdn.microsoft.com/Forums/en/wpf/thread/7b4b0c88-6b8f-4f07-aa8b-8e7018762388

1

Hãy thử xem các thuộc tính MaxLinesMinLines.

Từ trên liên kết:

Thiết khách sạn này làm cho hộp văn bản để thay đổi kích thước nếu số lượng đường có thể nhìn thấy vượt quá giới hạn theo quy định của Maxlines. Thuộc tính này chỉ áp dụng cho các dòng hiển thị và không hạn chế số dòng thực tế. Tùy thuộc vào cấu hình của nó, hộp văn bản có thể chứa các dòng không hiển thị bổ sung có thể truy cập được bằng cách cuộn. Nếu thuộc tính Độ cao được đặt rõ ràng trên một Hộp văn bản, các giá trị thuộc tính MaxLines và MinLines bị bỏ qua.

hãy thử thay đổi:

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

để

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

Chỉnh sửa: Cung cấp cho một thử này. Cài đặt là VerticalContentAlignment của số TabItem. Điều này sẽ giữ cho hộp văn bản ở trên cùng của Tab, tôi cũng thiết lập các maxlines đến những gì khu vực có sẵn của bạn có thể giữ nếu bạn thay đổi kích thước hình thức của bạn, bạn có thể muốn điều chỉnh số đó để sử dụng tất cả các không gian có sẵn.

<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> 

Edit:

Sau khi xem xét nó hơn nữa, lý do các thanh cuộn không được hiển thị trên TextBox là do TabControlTabItem được thay đổi kích thước với kích thước của các TextBox. Những gì cần phải làm là có chiều cao giới hạn được đặt trên TabControl, TabItem hoặc TextBox điều này sẽ cho phép ScrollViewer hoạt động cho TextBox.

+0

Ý tưởng hay nhưng không ảnh hưởng gì. – mbursill

+0

@mbursill Nó có giới hạn chiều cao không? Nó sẽ phát triển theo số dòng lên đến giá trị bạn đã đặt. –

+0

Không. Tôi đã thử thiết lập MaxLines thành 5, và khi tôi vượt quá 5 dòng, không có gì khác xảy ra. Khi tôi đạt đến 9 dòng (nếu tôi đã không thay đổi kích thước cửa sổ vượt quá 450 ví dụ của tôi), hộp TextBox bắt đầu mở rộng theo chiều dọc, làm cho trình xem cuộn ngoài cùng có thể cuộn dọc. Các thanh cuộn của TextBox không bao giờ được sử dụng. – mbursill

0

tôi thấy rằng giải pháp tốt nhất cho điều này là sử dụng Border thủ thuật nêu here, áp dụng cả hai chiều dọc và chiều ngang.

Trong ví dụ sau, một ScrollViewer chứa một TextBox, nơi nó được mong muốn để có TextBox phù hợp với tất cả các không gian có sẵn (theo chiều dọc và chiều ngang), và có nó cuộn theo chiều dọc trước khi phụ huynh ScrollViewer. BorderPlaceHolderBorder quản lý Width của TextBox es khi cửa sổ chính được thay đổi kích thước. BorderDescriptionPlaceHolderBorder quản lý Height của DescriptionTextBox khi điều khiển chính được thay đổi kích thước và ScrollViewer của các cú đá TextBox trước khi kiểm soát gốc.

Điều quan trọng là phải có Margin s trong trình giữ chỗ Border 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>