【问题标题】:Silverlight: GridSplitter inside ScrollViewer behaving unexpectedlySilverlight:ScrollViewer 中的 GridSplitter 行为异常
【发布时间】:2012-03-02 19:33:07
【问题描述】:

我正在尝试构建一个两列布局,其中列的宽度可以通过使用拆分器来更改。调整浏览器窗口大小时,右列的宽度不应改变(它不应与网格宽度成比例)。两列都应具有最小宽度。当浏览器窗口太窄而无法显示两列时,应该会出现滚动条。

这是我的 XAML:

<Grid x:Name="LayoutRoot" Background="White">
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
        <Grid Height="200" Margin="0,0,0,0" MinWidth="400" VerticalAlignment="Top">
            <Grid.ColumnDefinitions>
                <ColumnDefinition MinWidth="300" Width="300*" />
                <ColumnDefinition Width="10" />
                <ColumnDefinition MinWidth="100" Width="100"/>
            </Grid.ColumnDefinitions>
            <Grid Grid.Column="0" Background="Red" x:Name="LeftColumn"></Grid>
            <sdk:GridSplitter Grid.Column="1" HorizontalAlignment="Center" Width="10" Background="Black" />
            <Grid Grid.Column="2" Background="Green" x:Name="RightColumn"></Grid>
        </Grid>
    </ScrollViewer>
</Grid>

我遇到的问题是当拆分器被拖到左边并且达到左列的最小宽度时 - 右列开始非常迅速地增长并且出现滚动条。从右列中删除宽度设置消除了奇怪的行为,但现在右列在调整窗口大小时开始按比例增长......

我希望拆分器的行为与向右拖动时相同 - 我希望它在达到最小宽度后停止。

【问题讨论】:

  • 奇怪的行为......但是,当将第三列的宽度设置为 100* 时,它停止了增长。顺便问一下,¿你为什么把 Grid 放在 ScrollViewer 里面?
  • @NestorArturo - 将宽度设置为 100* 使第三列成比例,这不是我需要的行为。我在滚动查看器中放置了一个网格,这样当浏览器窗口的大小调整为小于网格的最小宽度时 - 会显示一个水平滚动条并且 UI 仍然可用。
  • @NestorArturo - 定义不带“*”的列宽会阻止网格拉伸到屏幕的可用宽度。我希望网格占据所有可用的水平空间。

标签: silverlight scrollviewer gridsplitter


【解决方案1】:

您应该禁用“Horizo​​ntalScrollBarVisibility”。 这段代码对我有用:

 <Grid x:Name="LayoutRoot" Background="White">
    <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Disabled">
        <Grid Height="200" Margin="0,0,0,0" MinWidth="400" VerticalAlignment="Top">
            <Grid.ColumnDefinitions>
                <ColumnDefinition MinWidth="300" Width="300*" />
                <ColumnDefinition Width="10" />
                <ColumnDefinition MinWidth="100" Width="100"/>
            </Grid.ColumnDefinitions>
            <Grid Grid.Column="0" Background="Red" x:Name="LeftColumn"></Grid>
            <sdk:GridSplitter Grid.Column="1" HorizontalAlignment="Center" Width="10" Background="Black" />
            <Grid Grid.Column="2" Background="Green" x:Name="RightColumn"></Grid>
        </Grid>
    </ScrollViewer>
</Grid>

ScrollViewer 为网格提供了无限的增长空间。因此 minWidth 永远不会停止它。 显然不需要垂直和水平禁用的 ScrollViewer。最好在每列内容周围的网格内移动滚动条。

【讨论】:

  • 不幸的是,我无法在列的内容内移动滚动条。当浏览器窗口太窄而无法提供可接受的视图时,我需要能够水平滚动整个网格。正如您正确地注意到的那样,拥有一个完全禁用滚动条的 ScrollViewer 是没有意义的。
  • 这里发生的情况是,scrollviewer 为其直接子级提供了无限空间...是否可以将 ScrollViewer 作为 LayoutRoot,这样您的 Grid 将成为外部 Grid 的直接子级?跨度>
【解决方案2】:

我想我终于能够想出一个解决方法。当布局发生变化时,我在代码隐藏中强制宽度。

XAML:

<Grid x:Name="LayoutRoot" Background="White">
    <ScrollViewer x:Name="Scroller" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
        <Grid x:Name="Workspace" Height="200" Margin="0,0,0,0" MinWidth="400" VerticalAlignment="Top" LayoutUpdated="Workspace_LayoutUpdated">
            <Grid.ColumnDefinitions>
                <ColumnDefinition MinWidth="300" Width="300*" />
                <ColumnDefinition Width="10" />
                <ColumnDefinition MinWidth="100" Width="100"/>
            </Grid.ColumnDefinitions>
            <Grid Grid.Column="0" Background="Red" x:Name="LeftColumn"></Grid>
            <sdk:GridSplitter Grid.Column="1" HorizontalAlignment="Center" Width="10" Background="Black" />
            <Grid Grid.Column="2" Background="Green" x:Name="RightColumn"></Grid>
        </Grid>
    </ScrollViewer>
</Grid>

后面的代码:

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void Workspace_LayoutUpdated(object sender, EventArgs e)
    {
        Workspace.Width = Scroller.ViewportWidth - 1;
    }

}

【讨论】:

    【解决方案3】:

    这样做的原因是您已用星号指定了第一列Width="300*", 第三列Width="100"没有星号。

    只需在第一列和第三列加上星号,或者分别删除,它就会按照您的意愿工作。

    【讨论】:

    • Verbeia - 你能解释一下为什么在两列中添加星号或星号会起作用吗?我遇到了同样的问题,但是在选择某些内容之前,我的右侧列并不总是可见,此时我希望右侧列能够获得在其中显示的用户控件的大小(即列宽=auto) 但是,如果我这样做,它的行为会很糟糕......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多