C# 将TableLayoutPanel置于父级中居中

C# 将TableLayoutPanel置于父级中居中,c#,layout,anchor,tablelayoutpanel,dockpanel,C#,Layout,Anchor,Tablelayoutpanel,Dockpanel,我花了好几个小时试图弄清楚如何组织我的用户界面,而PHP/CSS中的简单之处让我在C#中发疯 基本上,我正在创建一个名为Reply的类,它是一个2x2的TablePanelLayout,用于显示电子邮件回复。每个响应都将是这方面的一个实例,它们将出现在一个垂直列表中。我试图弄清楚如何创建这个布局,但要使它居中,并在父容器拉伸时调整它的大小 我上一次尝试使用了2个TablePanelLayouts。一个是3x3网格,使用中心单元格作为内容,其余的用于在边缘之间创建间距,但我意识到这种方法不允许滚动

我花了好几个小时试图弄清楚如何组织我的用户界面,而PHP/CSS中的简单之处让我在C#中发疯

基本上,我正在创建一个名为Reply的类,它是一个2x2的TablePanelLayout,用于显示电子邮件回复。每个响应都将是这方面的一个实例,它们将出现在一个垂直列表中。我试图弄清楚如何创建这个布局,但要使它居中,并在父容器拉伸时调整它的大小

我上一次尝试使用了2个TablePanelLayouts。一个是3x3网格,使用中心单元格作为内容,其余的用于在边缘之间创建间距,但我意识到这种方法不允许滚动中心内容区域。所以我的问题是…最好的方法是什么

我认为垂直FlowLayoutPanel最适合内容,但我不知道如何保持内容区域居中,同时在调整父级大小时允许其拉伸

编辑

如果说得更清楚的话,我想这个想法是

<OutsideLayout>
     <RepliesContainer>
          <Reply></Reply>
          <Reply></Reply>
          <Reply></Reply>
     </RepliesContainer>
<OutsideLayout>

其中“RepliesContainer”是一个垂直的FlowLayoutPanel,“Reply”是每个响应的我的TableLayoutPanel,“OutsideContainer”是保持其居中但允许内部内容滚动所需的任何内容。我不确定是否需要“外部容器”,但我不知道如何使用DockStyle。否则,填充并保持边缘之间的间距


保留空格的最简单方法是在RepliesContainer中添加相等值的左右边距。然后将其水平对齐设置为“拉伸”(这应该已经是默认设置)

接下来,让你的回复容器列出你需要的所有回复。这可能会使您的列表高于您的可见区域(下一步将解决此问题)

最后,让您的OutsideLayout成为一个ScrollViewer

当然,我一开始不会这么做。我个人会使用一个简单的ItemsControl,它处理滚动条和垂直面板,并列出单个2x2回复。类似这样的东西(在伪代码中,所以它可能无法编译。但是你会明白的。)


... 网格单元格的内容等。。。
注意:这会将左右边距放在滚动条区域内。如果希望边距位于滚动条之外,请将边距属性放在ItemsControl本身上

然后您只需设置DataContext并确保它有一个名为MyRepliesData的IEnumerable属性,该属性包含每个单独的回复


这是正确的做法。通过这种方法,您可以通过只关注数据工作方式的“模板”来定制需要的任何东西。ItemsControl担心的是如何将其全部布局并提供一个滚动条。您唯一的责任是通过MyRepliesData为其提供数据。

除了使用边距属性外,您还可以添加和设置分隔宽度和高度的面板,这可能会增加应用程序的加载时间
<ItemsControl x:Name="MyRepliesControl"
    DataSource="{Binding MyRepliesData}">

    <!-- This is the template for an individual reply.
         The ItemsControl will create one instance for each reply automatically. -->
    <ItemsControl.ItemTemplate>

        <!-- 2x2 Reply Grid with a 24-unit margin on the left and right -->
        <Grid Margin="24,0" ...>
            ... contents of grid cells, etc. ...
        </Grid>

    </ItemsControl.ItemTemplate>

</ItemsControl>