2010-10-03 66 views
1

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

<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”被折叠,它的行为更像是隐藏而不是折叠。崩溃似乎适用于自动大小的宽度,但它不会根据需要给予比例调整大小。有没有办法做到这一点。请注意,我只能访问Grids,StackPanels和Canvas以布局我的项目(无DockPanel)。请让我知道任何想法以及任何代码片段。谢谢。

回答

0

难以告诉你的意图在布局,但这里是一个示例,让你开始。
我在Click事件中将ColumnDefintion宽度从*更改为Auto,并将“可见性”设置为“abc”网格的Collasped。我使用第二个按钮来更改这些值以用于测试目的,并且删除了不需要的额外级别的网格。

<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; 
    } 
} 
0

有同样的问题,只有在中间的第三列有一个分流器变得更糟。

基本上我绑定列宽度(每个)的属性,返回自动在一种模式和明星在另一种模式。确保为属性实现INotifyPropertyChange,并在更改控制布局的标志时调用两个列属性名称的onchange助手。

+0

注:该解决方案是为那些使用MVVM风格模式(即没有代码隐藏)。现在没有意义提供代码,因为你显然对代码隐藏感到满意。 – 2010-10-03 22:26:53