我发现自己在WPF的网格内嵌套了许多网格。我只是发现自己深处3个网格,然后停下来思考:“我应该这样做吗?”有某种性能成本吗?它无法维持吗? (也许有点像嵌套的if s。)

我猜另一种选择是拥有一个网格,并使用很多列跨度。

(您可能会忽略使用事件,我知道命令可能是一个更好的主意)



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

<Grid Grid.Column="1">
    <Grid.RowDefinitions>
        <RowDefinition Height="20"/>
        <RowDefinition/>
        <RowDefinition Height="20"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <Button Grid.Row="0" Grid.Column="0" VerticalAlignment="Top" 
        HorizontalAlignment="Left" Click="btnStart_Click" 
        Content="New Game"/>
    <Button Grid.Row="0" Grid.Column="1" VerticalAlignment="Top" 
        HorizontalAlignment="Center" Click="btnRun_Click" 
        Content="Run"/>
    <Button Grid.Row="0" Grid.Column="2" VerticalAlignment="Top" 
        HorizontalAlignment="Center" Click="btnUndo_Click" 
        Content="Undo"/>
    <Button Grid.Row="0" Grid.Column="3" VerticalAlignment="Top" 
        HorizontalAlignment="Right" Click="btnStep_Click" 
        Content="Step"/>

    <Grid Grid.Row="1" Grid.ColumnSpan="4">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <board:BoardView x:Name="boardView" Grid.Row="0"  Background="Firebrick"/>
        <GridSplitter  ResizeDirection="Rows" HorizontalAlignment="Stretch" 
            VerticalAlignment="Bottom" />
        <TextBox Name="txtLog" Grid.Row="1" 
            Text="{Binding Path=GameLog.Log, Mode=TwoWay}"
            VerticalScrollBarVisibility="Visible" FontFamily="Global Monospace" 
            AcceptsReturn="True" Height="260" VerticalAlignment="Stretch"/>

    </Grid>

    <CheckBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3"  
        Content="Use Algebraic Notation" 
        IsChecked="{Binding Path=UseAlgebraicNotation}"/>

</Grid>

<ContentControl Grid.Column="0" 
                Content="{Binding Path=Game.BlackPlayer}"
                Margin="3"
                />

<ContentControl Grid.Column="3" 
                Content="{Binding Path=Game.WhitePlayer}"
                Margin="3"
                />

</Grid>
 


评论

如果您问我,在网格中对内容进行逻辑分组是否有意义,那么就去做吧。如果它们无关,那么您绝对应该重新考虑您的工作。

#1 楼

最好使用易于阅读的嵌套网格,而不是复杂的跨越。我尽量避免在大多数情况下出现跨度,除非它只是一个简单的跨度。但是,如果有疑问,请嵌套网格,因为那样一来,将来的布局更改就不会破坏所有内容,因为跨度与您拥有的列数直接相关。

一个很好的例子是标题和页脚,您不希望它们不填充应用程序的宽度,

#2 楼

网格是XAML技术中最强大的布局控件。由于您在另一个网格内使用了网格,因此您可能已经考虑过先使用另一个布局控件。但是它们无法满足您的需求。在许多情况下,我需要考虑一些布局控件:


我可以垂直或水平堆叠这些控件吗?所以我使用StackPanel。
我只想要一种视觉效果,并且只有一个孩子?所以我使用Border。
我想堆叠这些控件,但是其中一个需要填充最后一个?使用DockPanel。

除Grid以外的布局控件都非常具体。网格使您能够
选择更易于修改的界面。

将网格放入其他对象后,其他人就可以轻松进行更改。您将界面的每个部分的逻辑分开,以便每个部分都变得紧凑。

P.S.我从未使用过的画布。仅在需要编写诸如拖放之类的代码或需要在屏幕上进行非常硬性编码的代码时使用。 (我不记得拖放以外的东西了)。如果您尝试仅使用一个网格,则可以。但是对于您和任何需要使用该代码的人来说,这将是非常困难的。如果打开任何Framework控件,您会发现它也使用了很多网格。