Silverlight 中的布局

Posted

技术标签:

【中文标题】Silverlight 中的布局【英文标题】:Layout in silverlight 【发布时间】:2011-04-20 12:55:00 【问题描述】:

我遇到了一个不知道如何解决的布局问题。这是我的 xaml 的样子,

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid x:Name="abc" Grid.Row="0" Grid.Column="0">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="40" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <Button Grid.Row="0" Grid.Column="0"></Button>
            <TextBox Grid.Row="0" Grid.Column="1"></TextBox>
        </Grid>
    </Grid>

    <Grid Grid.Row="0" Grid.Column="1">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="40" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <Button Grid.Row="0" Grid.Column="0"></Button>
            <TextBox Grid.Row="0" Grid.Column="1"></TextBox>
        </Grid>
    </Grid>
</Grid>

现在上面的 xaml 的布局正是我想要的。但是,我还有一个额外的要求。在运行时,我需要使网格“abc”可折叠。另一个网格需要填充整个宽度。如果我使用星号宽度,那么如果“abc”被折叠,它的行为更像是隐藏而不是折叠。 Collapse 似乎适用于自动调整大小的宽度,但它并没有根据需要给我按比例调整大小。有没有办法做到这一点。请注意,我只能访问 Grids、StackPanels 和 Canvas 来布局我的项目(没有 DockPanel)。请让我知道任何想法以及任何代码 sn-ps。谢谢。

【问题讨论】:

【参考方案1】:

在布局中很难说出您的意图,但这里有一个示例可以帮助您入门。 我在 Click 事件中将 ColumnDefintion 宽度从 * 更改为 Auto,并将“abc”网格的 Visibility 设置为 Collasped。我使用第二个按钮来更改这些值以进行测试,并删除了不需要的额外级别的 Grid。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="ColumnToCollapse" Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid x:Name="abc" Grid.Row="0" Grid.Column="0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="40" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Button Grid.Row="0" Grid.Column="0"></Button>
        <TextBox Grid.Row="0" Grid.Column="1"></TextBox>
    </Grid>

    <Grid Grid.Row="0" Grid.Column="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="40" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Button Grid.Row="0" Grid.Column="0" Click="Button_Click"  />
        <TextBox Grid.Row="0" Grid.Column="1"></TextBox>
    </Grid>
</Grid>

这里是按钮点击事件:

private bool _toggle = true;

private void Button_Click(object sender, RoutedEventArgs e)

  if (_toggle)
  
    ColumnToCollapse.Width = GridLength.Auto;
    abc.Visibility = Visibility.Collapsed;
    _toggle = false;
  
  else
  
    ColumnToCollapse.Width = new GridLength(1, GridUnitType.Star); 
    abc.Visibility = Visibility.Visible;
    _toggle = true;
  

【讨论】:

【参考方案2】:

遇到了同样的问题,只是在中间第三列有一个拆分器使情况变得更糟。

基本上,我最终将列宽(每个列宽)绑定到在一种模式下返回 auto 并在另一种模式下返回 star 的属性。确保为属性实现 INotifyPropertyChange,并在更改控制布局的标志时为两个列属性名称调用 onchange 助手。

【讨论】:

注意:此解决方案适用于那些使用 MVVM 样式模式(即无代码隐藏)的解决方案。现在提供代码没有意义,因为您显然对代码隐藏感到满意。

以上是关于Silverlight 中的布局的主要内容,如果未能解决你的问题,请参考以下文章

WPF和Silverlight的关系

Silverlight 中的布局

Silverlight:在布局中查找所有类型的控件

我要开发网络会议软件

如何布局 Silverlight 应用程序?

如何以编程方式将 Silverlight Grid 布局 ColumnDefinition 宽度设置为“*”?