【问题标题】:Why does my ScrollViewer destroy my Grid Layout? WPF为什么我的 ScrollViewer 会破坏我的网格布局? WPF
【发布时间】:2026-01-08 20:45:01
【问题描述】:

问题:在 Grid 周围添加 ScrollViwer 时,Grid 缩放被取消!

Eksampel: 我创建了一个网格宽度为 3 列,1. coulymn 应该总是比第 2 列和第 3 列大 2 倍! 如果没有 ScrollViewer,这始终是正确的,但添加它时,它允许每列决定自己的大小。

<Window x:Class="alternatingGridRow.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="200" Width="Auto" Loaded="WindowLoaded">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
    <Grid x:Name="LayoutRoot" ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" MinHeight="23" MaxHeight="60"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
            <TextBlock HorizontalAlignment="Stretch" Text="sdasdasdasdsadsadasddasdck" TextWrapping="Wrap" VerticalAlignment="Top" />
            <TextBlock Foreground="Red" Grid.Column="1" HorizontalAlignment="Stretch" Text="sdasdasdasdsadsadasddasdck" TextWrapping="Wrap" VerticalAlignment="Top" />
    </Grid>
</ScrollViewer>

您可以清楚地看到比例因子完全错误!由于 2. 列太大了!并且 3. 列是一些随机大小...

Wrong Scaling factors

对此的任何建议都很受欢迎.... 干杯马丁

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

    您要求网格为每列分配一定百分比的无限空间。无限,因为在您的 ScrollViewer 上启用了水平滚动,而 ScrollViewers 的全部意义在于虚拟化空间。所以你要求它做的事情甚至没有意义。

    【讨论】:

      【解决方案2】:

      好的,我明白你的观点,为什么列的大小是拧紧的。
      但是..我在阅读您的帖子时想到了一个解决方案...

      Mohammed 说,在我的网格上设置一个固定宽度,好吧.. 我希望我的网格与滚动查看器具有相同的宽度,除非它变小,然后我希望滚动查看器生效! 所以..我的解决方案是:

      MinWidth="500" Width="{Binding ActualWidth, ElementName=scrollviewer}"
      
      <Window x:Class="alternatingGridRow.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="MainWindow" Height="200" Width="Auto">
      <ScrollViewer x:Name="scrollviewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
          <Grid x:Name="LayoutRoot" ShowGridLines="True" MinWidth="500" Width="{Binding ActualWidth, ElementName=scrollviewer}">
              <Grid.RowDefinitions>
                  <RowDefinition Height="Auto" MinHeight="23" MaxHeight="60"/>
                  <RowDefinition/>
              </Grid.RowDefinitions>
              <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="2*"/>
                  <ColumnDefinition Width="1*"/>
                  <ColumnDefinition Width="1*"/>
              </Grid.ColumnDefinitions>
                  <TextBlock HorizontalAlignment="Stretch" Text="sdasdasdasdsadsadasddasdck" TextWrapping="Wrap" VerticalAlignment="Top" />
                  <TextBlock Foreground="Red" Grid.Column="1" HorizontalAlignment="Stretch" Text="sdasdasdasdsadsadasddasdck" TextWrapping="Wrap" VerticalAlignment="Top" />
          </Grid>
      </ScrollViewer>
      
      </Window>
      

      (仅水平固定)

      谢谢。

      【讨论】:

      • 很高兴您找到了解决方案,别忘了接受解决方案 ;)
      【解决方案3】:

      当前设置是错误的,因为ScrollViewer不限制其子容器的宽度和高度(即无限),而且Grid总是填充其父容器上所有可用的水平和垂直空间,这就是为什么你会看到这种奇怪的行为。您必须执行以下操作之一:

      1. 或者,删除您提到的ScrollViewer
      2. 或者,为您的Grid 设置一个固定的高度和宽度。

      【讨论】:

        最近更新 更多