【问题标题】:User control inside ScrollViewer doesn't scroll in WPFScrollViewer 中的用户控件在 WPF 中不滚动
【发布时间】:2013-02-28 12:16:17
【问题描述】:

我的主窗口中有以下代码(缩写):

虽然我设置了滚动条可见性和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>

【问题讨论】:

    标签: wpf xaml user-controls scrollviewer


    【解决方案1】:

    你需要这样设置。我将 Row0 的 RowDefinition 更改为 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>
    

    【讨论】:

    • 仅当我还为 ScrollViewer 设置了 Height 时才有效。但是设置ScrollViewer的高度不是我想要的。
    • 尝试将 Row0 的 RowDefinition 更改为;
    • 完成。很高兴它奏效了。我最近也在使用滚动查看器。
    • 如果ScrollViewerTabItem 内,就像我的原始版本一样,它也可以工作。唯一的一点是不允许ScrollViewer 使用尽可能多的空间(就像将高度设置为自动一样)
    【解决方案2】:

    当您将 CanContentScroll 设置为 True 时,ScrollViewer 会假定您的内容实现了 IScrollInfo(我猜没有)。

    尝试将 ScrollViewer 上的 CanContentScroll 设置为 false,这允许内容使用尽可能多的空间,并且 ScrollViewer 负责滚动。

    但是,根据控件的大小、视觉效果的数量等,这可能会成为性能问题(例如,当 CanContentScroll 设置为 False 时没有 UI 虚拟化)。

    【讨论】:

    • CanContentScroll 设置为false 没有帮助。我现在假设原因是ScrollViewer 本身认为它可以使用无限的空间,因此不需要滚动内容,因为它适合无限大的ScrollViewer。这是因为将ScrollViewer 设置为定义的高度/宽度会启用滚动。但我不想限制应该使用所有可用空间的ScollViewer 的大小。
    【解决方案3】:

    看起来您的滚动查看器中的内容与查看器的大小相同,因此没有可滚动的内容?

    如果你做类似的事情

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

    那么网格与滚动查看器的大小相同,并且永远不允许滚动,如果您将网格的高度设置为超过查看器可以显示的高度,您将获得一个滚动条。

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

    【讨论】:

    • &lt;my:MY_USER_CONTROL&gt; 的高度设置为固定值并没有真正的帮助。该控件现在具有固定高度,但无法滚动。将ScrollViewer 的高度设置为固定值允许滚动内容,但我真的希望ScrollViewer 占用可用空间。
    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多