2015-02-19 8 views
1

У меня есть следующее окноСодержание ScrollViewer не продлит

pic

Теперь, если я попытаюсь спустить GridSplitter я могу только, насколько синяя сетка помещается в видимом окне. Но при сползании сплиттера я хочу, чтобы полоса прокрутки появлялась и могла вытащить ее до хлопка до тех пор, пока синяя сетка больше не будет видна.

<Window.Content> 
    <Grid>   
     <Grid.RowDefinitions> 
      <RowDefinition Height="25"/> 
      <RowDefinition /> 
      <RowDefinition Height="25" /> 
     </Grid.RowDefinitions> 
     <Menu Name="MainMenu" Grid.Row="0">     
     </Menu> 
     <Grid Grid.Row="1"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="200" /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <DockPanel x:Name="Green" Grid.Column="0" Width="Auto" Height="Auto"> 
       <views:MyView></views:MyView> 
      </DockPanel> 
      <GridSplitter Grid.Column="0" Width="6"></GridSplitter> 
      <Grid Grid.Column="1" > 
       <ScrollViewer VerticalScrollBarVisibility="Auto"> 
        <Grid VerticalAlignment="Stretch"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="*" /> 
          <RowDefinition Height="7" /> 
          <RowDefinition Height="*" /> 
         </Grid.RowDefinitions> 
         <Grid Grid.Row="0"> 
          <views:ListView x:Name="Yellow" ></views:ListView> 
         </Grid> 
         <GridSplitter Grid.Row="1" Height="7" HorizontalAlignment="Stretch" /> 
         <Grid Grid.Row="2" > 
          <ContentControl Content="{Binding LoadedControl}" x:Name="Blue" /> 
         </Grid> 
        </Grid> 
       </ScrollViewer> 
      </Grid> 
     </Grid> 
     <StatusBar x:Name="StatusBar" Grid.Row="2">     
     </StatusBar> 
    </Grid> 
</Window.Content> 

Что мне нужно изменить здесь?

+1

Переместите 'ScrollViewer' дальше вниз, так что заворачивает синий' ContentControl' в строке 2, и убедитесь, что ' ContentControl' имеет настройку Height или MinHeight. ScrollViewers позволяют их ребенку занимать столько места, сколько захотят, и если дочерний объект будет больше размера ScrollViewer, появится полоса прокрутки. – Rachel

+0

@ Рейчел: Можете ли вы поместить это в ответ? Это сработало. –

+0

Несомненно, он опубликован. [Ответ YEL] (http://stackoverflow.com/a/28610832/302677) также сказал что-то подобное, но на самом деле его не объяснили и пропустили настройку высоты/MinHeight элементов управления внутри 'ScrollViewer'. И у него был дополнительный. – Rachel

ответ

2

Переместить ваш ScrollViewer дальше вниз, так что заворачивает в строке 2 синий ContentControl, и убедитесь, что ContentControl имеет Height или MinHeight набор.

ScrollViewers позволяют их ребенку занимать столько места, сколько захотят, и показывают только полосы прокрутки, если дочерний объект становится больше размера ScrollViewer.

Также в качестве примечания вы можете удалить некоторые из этих дополнительных гридов в своем макете, чтобы упростить их чтение. Вот пример с кучей из них удалены, и первый один заменяется на DockPanel :)

<DockPanel>   
    <Menu Name="MainMenu" DockPanel.Dock="Top" Height="25" /> 
    <StatusBar x:Name="StatusBar" DockPanel.Dock="Bottom" Height="25"/> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="200" /> 
      <ColumnDefinition Width="6" /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 

     <views:MyView x:Name="Green" Grid.Column="0" /> 
     <GridSplitter Grid.Column="1" Width="6" /> 
     <Grid Grid.Column="2" > 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="7" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 

      <views:ListView x:Name="Yellow" Grid.Row="0" /> 
      <GridSplitter Grid.Row="1" Height="7" HorizontalAlignment="Stretch" /> 
      <ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto"> 
       <ContentControl x:Name="Blue" MinHeight="400"/> 
      </ScrollViewer> 
     </Grid> 
    </Grid>  
</DockPanel> 
0

, если вы хотите, чтобы отобразить вертикальную полосу прокрутки для каждой части в расщепленной сетке попробуйте следующий код:

<Grid Grid.Row="1"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="200" /> 
        <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 
       <DockPanel x:Name="Green" Grid.Column="0" Width="Auto" Height="Auto" Background="#FF0CFA8F" > 
        <local:BusyUserControl Width="200" Height="200"/> 
       </DockPanel> 
       <GridSplitter Grid.Column="0" Width="6"></GridSplitter> 
       <Grid Grid.Column="1" > 
        <Grid VerticalAlignment="Stretch"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="*" /> 
          <RowDefinition Height="7" /> 
          <RowDefinition Height="*" /> 
         </Grid.RowDefinitions> 
         <ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Row="0" > 
          <Grid > 
           <views:ListView x:Name="Yellow" ></views:ListView> 
          </Grid> 
         </ScrollViewer> 
         <GridSplitter Grid.Row="1" Height="7" HorizontalAlignment="Stretch" /> 
         <ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Row="2" > 
          <Grid Grid.Row="2" > 
           <ContentControl Content="{Binding LoadedControl}" x:Name="Blue" /> 
          </Grid> 
         </ScrollViewer> 
        </Grid> 
       </Grid> 
      </Grid> 

иначе уточнить вашу потребность

+0

Я не хочу отображать полосу прокрутки для каждого из них. Только один. Но в настоящее время он не работает. –

1

Надеется, что вы найдете лучшее XD решения, как мои использовать код позади

Я использовал событие DragDelta управляющего GridSplitter и увеличить высоту сетки, так что ScrollBar можно активировать

Часть XAML Код:

 <Grid Grid.Row="1"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="200" /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <DockPanel x:Name="Green" Grid.Column="0" Width="Auto" Height="Auto" Background="#FF0CFA8F" > 
       <local:BusyUserControl Width="200" Height="200"/> 
      </DockPanel> 
      <GridSplitter ResizeDirection="Rows" Grid.Column="0" Width="6"></GridSplitter> 
      <ScrollViewer x:Name="MainScrollViewer" VerticalScrollBarVisibility="Auto" Grid.Column="1" > 
       <Grid x:Name="MainGrid"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="7" /> 
         <RowDefinition Height="Auto"/> 
         </Grid.RowDefinitions> 
         <Grid > 
          <views:ListView x:Name="Yellow" ></views:ListView> 
         </Grid> 
         <GridSplitter Grid.Row="1" Height="7" ResizeBehavior="PreviousAndNext" HorizontalAlignment="Stretch" DragDelta="GridSplitter_DragDelta" /> 
         <Grid Grid.Row="2"> 
          <ContentControl Content="{Binding LoadedControl}" x:Name="Blue" /> 
         </Grid> 
       </Grid> 
      </ScrollViewer> 
     </Grid> 

Код За:

private void GridSplitter_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
    { 
     if (e.VerticalChange > 1500 || e.VerticalChange > -15000) return; 

     if (e.VerticalChange > 0 || Visibility.Visible.Equals(MainScrollViewer.ComputedVerticalScrollBarVisibility)) 
     { 
      this.MainGrid.Height = this.MainGrid.ActualHeight + e.VerticalChange; 
     } 
     e.Handled = true; 
    } 

Примечание: Когда полоса прокрутки не более заметным я останавливаю сокращение сетки (держать сетку stretshed) это значение условия

Visibility.Visible.Equals(MainScrollViewer.ComputedVerticalScrollBarVisibility) 

Надеюсь, что это может помочь вам и ТНХ на вопрос :)

Смежные вопросы