2011-09-27 71 views
1

我有一个XAML在网格中有2列,我有一个按钮,当我点击它时,在代码背后,我设置了可视性崩溃,并且想要调整另一半的大小屏幕尝试占据整个屏幕。崩溃部分工作,然后RHS转移到LHS,但它不占用整个屏幕。我尝试使用Auto和Star在HidePlots中调整大小,但它绝不会占用整个屏幕。我想如果我把LHS倒塌了,并且把RHS的列设置为*,它会占用整个屏幕。有什么想法吗?谢谢。WPF调整大小,*对比汽车

下面是一些代码,使之更加明确:

<Grid Grid.Row="1" x:Name="ExpandableGrid">    
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"></ColumnDefinition> 
     <ColumnDefinition Width="1.5*"></ColumnDefinition> 
    </Grid.ColumnDefinitions> 

    <Grid Grid.Column="0" x:Name="TableGrid"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
     </Grid.RowDefinitions>    

     <GroupBox Grid.Row="0" Grid.Column="0" x:Name="SampleViewGroupBox" Header="SampleView" HorizontalAlignment="Stretch" FontFamily="Arial" FontSize="12" Margin="5,0,5,0" > 
      <ContentControl Content="{Binding LayoutManager.SampleView}" Height="Auto" Width="Auto"/> 
     </GroupBox> 

     <Button x:Name="TableButton" HorizontalAlignment="Right" Content="Button" Width="15" Height="15" VerticalAlignment="Top" Margin="0,0,-2,0" Click="MaxButton_Click" Grid.Column="0" Grid.Row="0"/> 
    </Grid> 

    <Grid Grid.Column="1" x:Name="BaseViewGrid"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"></RowDefinition> 
     </Grid.RowDefinitions> 
     <GroupBox Grid.RowSpan="2" Grid.Column="1" Name="BaseViewGroupBox" Header="PLOTS" Margin="5,0,5,0" > 
      <ContentControl Content="{Binding LayoutManager.ConsensusView}" Height="Auto" Width="Auto" /> 
     </GroupBox> 
    </Grid> 
</Grid> 



private void MaxButton_Click(object sender, RoutedEventArgs e) 
{ 
    UIElement senderElement = (UIElement)sender; 

    if (_tableMinimized) 
    { 
     HideTables(false); 
     _tableMinimized = false; 
     ((Button)senderElement).Style = (Style)FindResource("DashboardDetailsButton"); 
    } 
    else 
    { 
     HideTables(true); 
     _tableMinimized = true; 
     ((Button)senderElement).Style = (Style)FindResource("DashboardDetailsButtonReverse");    
    } 
} 

private void HideTables(bool hide) 
{ 
    if (hide) 
    { 
     foreach (UIElement child in TableGrid.Children) 
      child.Visibility = Visibility.Collapsed; 

     for (int i = 0; i < ExpandableGrid.ColumnDefinitions.Count; i++) 
      ExpandableGrid.ColumnDefinitions[i].Width = GridLength.Auto; 

     ExpandableGrid.ColumnDefinitions[1].MinWidth = 500; 

     for (int i = 0; i < ExpandableGrid.RowDefinitions.Count; i++) 
      ExpandableGrid.RowDefinitions[i].Height = GridLength.Auto; 

     TableButton.Visibility = Visibility.Visible; 
    } 
    else 
    { 
     foreach (UIElement child in TableGrid.Children) 
      child.Visibility = Visibility.Visible; 

     for (int i = 0; i < ExpandableGrid.ColumnDefinitions.Count; i++) 
      ExpandableGrid.ColumnDefinitions[i].Width = new GridLength(1, GridUnitType.Star); 

     for (int i = 0; i < ExpandableGrid.RowDefinitions.Count; i++) 
      ExpandableGrid.RowDefinitions[i].Height = new GridLength(1, GridUnitType.Star); 
    } 
} 

编辑:我试着也改变一个行:

ExpandableGrid.ColumnDefinitions[1].MinWidth = System.Windows.SystemParameters.PrimaryScreenWidth-20; 

,而不是硬编码的500值,它看起来正确。但是,如果我尝试再次单击该按钮以恢复到正常状态,则RHS将占用屏幕的大部分空间,而无法恢复到原始位置。

+0

听起来像一个DockPanel可能会更好。 –

回答

1

您需要将第0列设置为您想要的任何值(自动,150等等),并将第1列设置为*。

看起来你的Grid也在Grid之内,所以父母的行为也必须考虑在内。

+0

如何将Expandable.Column Definitions [0] .MinWidth设置为*?它不一定是双重价值吗?谢谢。 – Crystal

2

您当前的列定义表示,使列B等于列A大小的1.5倍,因此即使列B的内容被隐藏,该列仍将占用屏幕的3/5

将其更改为使折叠的列有Width="Auto",并将它的内容的Width设置为等于展开时的任何大小。如果你想保持1.5*的默认宽度,我建议使用类似MathConverter的东西来根据父网格的宽度来确定它应该基于什么尺寸。我有一个贴的代码here

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

    <Grid x:Name="RHS" Grid.Column="0" /> 

    <!-- Collapse this Grid --> 
    <Grid x:Name="LHS" Grid.Column="1" 
      Width="{Binding ElementName=ParentGrid, Path=ActualWidth, 
      Converter={StaticResource MathConverter}, 
      ConverterParameter=((@VALUE/5)*3)}" /> 
</Grid>