使Grid的一部分不可见的最佳方法

时间:2015-11-18 11:31:03

标签: c# wpf xaml

我想将Grid的一部分的可见性绑定到ViewModel中的Property。我提出了一个解决方案,在网格中放入另一个Grid,其中包含应该折叠的控件。令人讨厌的部分是,有冗余的ColumnDefinitions:

<Grid>
    <Grid.RowDefinitions>
        ...
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="20"/>
        <ColumnDefinition Width="110"/>
        <ColumnDefinition Width="20"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="20"/>
        <ColumnDefinition Width="140"/>
        <ColumnDefinition Width="20"/>
        <ColumnDefinition Width="140"/>
        <ColumnDefinition Width="20"/>
    </Grid.ColumnDefinitions>
    ...
    <Grid Grid.Row="4" Grid.ColumnSpan="100" Visibility="{Binding VisibilityProperty}">
        <Grid.RowDefinitions>
            ... (some more rows)
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="110"/>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="140"/>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="140"/>
            <ColumnDefinition Width="20"/>
        </Grid.ColumnDefinitions>
        ...
    </Grid>

我想到的另一个解决方案是绑定每个控件的可见性,导致绑定比上面显示的更多。

我的问题是:有没有更好的方法来隐藏网格的一部分?如果可以重用父网格的ColumnDefinitions,我特别好奇。

1 个答案:

答案 0 :(得分:-1)

您可以使用WrapPanel代替嵌套Grid。您可以通过将FlowDirection属性设置为从右到左包装控件 RightToLeft并将Visibility属性设置为您想要的属性。例如:

<Window x:Class="SOWpfApplication.MainWindow"
    <!--The code is omitted for the brevity.-->
    Title="MainWindow" Height="350" Width="525">
 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="2*"/>
        <RowDefinition Height="2*"/>
        <RowDefinition Height="2*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <Button Click="Button_Click" Margin="5" Grid.Row="0" Grid.ColumnSpan="2">Hide the WrapPanel</Button>

    <WrapPanel Name="wrapPanel" Margin="5" Grid.Column="1" Grid.Row="1">
        <TextBox Text="Hello, dude!" Margin="5"/>
        <Button Content="I am the Button!" Margin="0,5,0,5"/>
        <TextBlock Text="Hey, I am textBlock!"/>
    </WrapPanel>       

</Grid>
</Window>

要隐藏WrapPanel,您可以使用Visibility属性,如下所示:

private void Button_Click(object sender, RoutedEventArgs e)
{
   if(wrapPanel.Visibility!= System.Windows.Visibility.Hidden)
     wrapPanel.Visibility = System.Windows.Visibility.Hidden;
   else
     wrapPanel.Visibility = System.Windows.Visibility.Visible;
}