2013-02-28 5 views
4

Я следующий код (сокращенно) в моем главном окне:управления пользователя внутри ScrollViewer не прокручивается в WPF

Хотя я установил как полоса прокрутки, обзорности и CanContentScroll свойства он не прокручивается. Я предполагаю, что это связано с моим пользовательским контролем.

<Window> 
    <Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
     <TabControl Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" Margin="0" VerticalAlignment="Stretch" Height="Auto" Width="Auto"> 
      <TabItem Header="TEST"> 
      <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
      <my:MY_USER_CONTROL x:Name="myUserControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ScrollViewer.CanContentScroll="True" /> 
      </ScrollViewer> 
     </TabItem> 
     </TabControl> 
     <Button Grid.Column="0" Grid.Row="2" >a button</Button> 
     <WrapPanel Grid.Column="0" Grid.Row="3" > 
     </WrapPanel> 
    </Grid> 
    </Window> 

Сокращенной структура моего пользовательского элемента управления:

<UserControl> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="183*" /> 
      <ColumnDefinition Width="117*" /> 
     </Grid.ColumnDefinitions> 
     <TreeView ItemsSource="{Binding Children}" Grid.ColumnSpan="2"> 
      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 

        <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
        <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 

        <Setter Property="FontWeight" Value="Normal" /> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="FontWeight" Value="Bold" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </TreeView.ItemContainerStyle> 

      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding Children}" > 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition></ColumnDefinition> 
          <ColumnDefinition></ColumnDefinition> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition></RowDefinition> 
         </Grid.RowDefinitions> 
         <Grid.Children> 
          <TextBlock Background="LightGray" Padding="2" Margin="2" Grid.Row="0" Grid.Column="0" Text="{Binding Name}" /> 
          <TextBlock Padding="2" Margin="2" Grid.Row="0" Grid.Column="1" Text="{Binding Content}" /> 
         </Grid.Children> 
        </Grid> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 
    </Grid> 
</UserControl> 

ответ

6

Вам необходимо установить его так. Я изменил RowDefinition для Row0 на Height = "*" Таким образом, он будет использовать как можно больше места. Затем изменилось место между ScrollViewer и TabControl. Таким образом, TabControl является содержимым ScrollViewer.

<Window> 
<Grid> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="*" /> 
    <RowDefinition Height="*" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" 
       VerticalScrollBarVisibility="Auto" 
       Grid.Column="0" Grid.Row="0"> 
    <TabControl HorizontalAlignment="Stretch" Margin="0" VerticalAlignment="Stretch" 
       Height="Auto" Width="Auto"> 
     <TabItem Header="TEST"> 
     <my:MY_USER_CONTROL x:Name="myUserControl" 
          HorizontalAlignment="Stretch"    
          VerticalAlignment="Stretch" 
          ScrollViewer.CanContentScroll="True" />   
    </TabItem> 
    </TabControl> 
</ScrollViewer> 
<Button Grid.Column="0" Grid.Row="2" >a button</Button> 
<WrapPanel Grid.Column="0" Grid.Row="3" > 
</WrapPanel> 
</Grid> 

+0

Работает только в том случае, если я также установил 'Height' для' ScrollViewer'. Но установка высоты 'ScrollViewer' - это не то, что я хочу. – Onur

+1

Попробуйте изменить RowDefinition for Row0 на; hijack

+0

Это сделало трюк! Отправьте его как ответ, и я соглашусь с ним. – Onur

0

Похоже, содержание внутри ScrollViewer имеет тот же размер, как зритель, так что нет ничего, чтобы прокрутить?

если вы делаете что-то вроде

<ScrollViewer HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
    <Grid Background="Red"> 

    </Grid> 
</ScrollViewer> 

Тогда решетка имеет такой же размер, как зритель прокрутки и никогда не позволите прокрутку, если установить высоту сетки больше, чем зритель может отображать вас» Я получу скроллер.

<ScrollViewer HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
    <Grid Background="Red" Height="500"> 

    </Grid> 
</ScrollViewer> 
+0

Установка '<мой: MY_USER_CONTROL>' высота 's для фиксированного значения не помогло. Теперь элемент управления имеет фиксированную высоту, но его нельзя прокручивать. Установка высоты 'ScrollViewer' на фиксированное значение позволяет прокручивать содержимое, но мне бы очень хотелось, чтобы' ScrollViewer' занимал свободное место. – Onur

1

При установке CanContentScroll в Истинного, то ScrollViewer предполагает, что содержание реализует IScrollInfo (который я угадываю это не распространяется).

Попробуйте установить CanContentScroll на ScrollViewer на false, это позволяет использовать контент как можно больше места, а ScrollViewer позаботится о прокрутке.

Однако, в зависимости от размера, количество и т.д. визуальных вашего контроля, это может стать проблемой производительности (например, нет виртуализации пользовательского интерфейса, когда CanContentScroll установлен в ложной).

+1

Настройка 'CanContentScroll' на' false' не помогла. Я предполагаю, что причина в том, что сам ScrollViewer считает, что он может использовать неограниченное пространство и, следовательно, не нужно прокручивать контент, поскольку он подходит для неограниченного большого 'ScrollViewer'. Это связано с тем, что настройки 'ScrollViewer' до определенной высоты/ширины позволяют прокручивать. Но я не хочу ограничивать размер «ScollViewer», который должен использовать все доступное пространство. – Onur

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