C# 如何在Xamarin.Forms中启用网格中的边框

C# 如何在Xamarin.Forms中启用网格中的边框,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我正在用Xamarin.Forms构建一个网格。 我想添加边框,比如表格。 我原以为可以在定义行和列时添加边框,但失败了。 有人能帮我吗? 这是我当前的代码 Grid grid = new Grid { VerticalOptions = LayoutOptions.FillAndExpand, RowDefinitions = { new RowDefinition { Height = GridLength.Auto }, new RowDef

我正在用Xamarin.Forms构建一个网格。 我想添加边框,比如表格。 我原以为可以在定义行和列时添加边框,但失败了。 有人能帮我吗? 这是我当前的代码

Grid grid = new Grid {
    VerticalOptions = LayoutOptions.FillAndExpand,
    RowDefinitions = {
        new RowDefinition { Height = GridLength.Auto },
        new RowDefinition { Height = GridLength.Auto },
        new RowDefinition { Height = GridLength.Auto },
        new RowDefinition { Height = GridLength.Auto },
        new RowDefinition { Height = GridLength.Auto },
        new RowDefinition { Height = GridLength.Auto },
        new RowDefinition { Height = GridLength.Auto },
        new RowDefinition { Height = GridLength.Auto },
        new RowDefinition { Height = GridLength.Auto },
        new RowDefinition { Height = GridLength.Auto },
        new RowDefinition { Height = GridLength.Auto },

    },
    ColumnDefinitions = {
        new ColumnDefinition { Width = new GridLength (1, GridUnitType.Star) },
        new ColumnDefinition { Width = new GridLength (5, GridUnitType.Star) },
        new ColumnDefinition { Width = new GridLength (1, GridUnitType.Star) },
    }
};

GridView
没有
Border
属性,但是:

只需将
grid.BackgroundColor
设置为所需的边框颜色值,然后将
grid.ColumnSpacing
grid.RowSpacing
设置为某个值,并确保添加到网格中的所有控件都正确设置了自己的
BackgroundColor

以下是完整答案(以XAML为单位)无需编写自定义渲染器或效果

代码有点冗长,但很容易理解,结果与图片上的一样

这是在你的网格上放置边界的代码(更重要的是,你可以完全控制它们,就像你注意到最左边没有蓝线一样)


刚刚注意到我的示例与Sturla的类似,但有一点不同,所以我将其保留

代码不是非常漂亮,但我做了类似的事情,在每列之间添加了一个1px
BoxView
,然后在
网格的顶部添加一个,在
网格的底部添加一个,如下所示:

<Grid VerticalOptions="FillAndExpand"
      HorizontalOptions="FillAndExpand"
      RowSpacing="0"
      ColumnSpacing="0">

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

  <Grid.RowDefinitions>
    <RowDefinition Height="1"/>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="1"/>
  </Grid.RowDefinitions>

  <BoxView BackgroundColor="Black"
           HeightRequest="1"
           HorizontalOptions="FillAndExpand"
           Grid.Row="0"/>

  <Grid VerticalOptions="Start"
        ColumnSpacing="0"
        Grid.Row="1">

    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*"/>
      <ColumnDefinition Width="1"/>
      <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <Button Text="Button 1"/>

    <BoxView BackgroundColor="Black"
             WidthRequest="1"
             VerticalOptions="FillAndExpand"
             Grid.Column="1"/>

    <Button Text="Button 1"
            Grid.Column="2"/>
  </Grid>

  <BoxView BackgroundColor="Black"
           HeightRequest="1"
           HorizontalOptions="FillAndExpand"
           Grid.Row="2"/>
</Grid>

*编辑:自从写了这篇文章,我已经改变了我做这件事的方式。现在,就像Daniel Luberda的回答一样,我只需将
Grid.BackgroundColor
设置为
Color.Black
,然后我就可以删除所有
BoxView
了。我这样做是因为我认为在屏幕上有很少的视图要好得多,特别是如果您在
列表视图中放置类似于上面的内容

另外,由于我的许多页面在加载页面时会设置
按钮的动画(使用
ScaleTo()
),我最初将
网格.BackgroundColor
设置为
Color.Transparent
Color.White
,动画完成后,我将其更改为
Color.Black
。到目前为止效果相当不错。


如果您想要一个比Daniel Luberda的anwser具有更多相等边界的解决方案,以下是我使用的:

制作一个网格,希望元素在其中具有边框。将列和行之间的间距设置为0。对于网格的每个元素,创建另一个包含Boxview的网格,并将视图放在该Boxview的顶部。然后,放置每个要填充和展开的BoxView。然后根据需要调整这些“下方”网格的填充。网格中的每个元素将被相等地分离


不过这很重。

除非我遗漏了什么。这将创建不均匀的边界-即:网格的顶部和底部将为1个像素,但分隔符将全部为2个像素。对于这样的基本控件来说,缺少合适的盒子模型似乎是一个真正的问题。我同意,这只适用于简单的网格。我有一个网格列表,有图像,列数可变,所有的列在整个列表中都需要有相同的宽度。我不想使用BoxView来获取单元格边框。我刚才说的是行和列之间的间距边框。最好的解决方法是使用frame,但目前它在android上不起作用。为此,您可以共享一些C#吗?那太好了,太好了。太糟糕了,Xamarin不仅提供了绘制矩形和文本的功能,我可能还可以用更少的代码行来创建网格,当然还有图像。这将节省大量的时间和精力。这里的问题是,您不能在最左边有一个竖线,因为同一列用于定义水平边框。相反,我为每一行的每一个垂直方向创建了一个框,然后为每一行绘制了一个水平方向的框。另一种方法不起作用——垂直线无法延伸到整个高度。这是维护的噩梦
<Grid VerticalOptions="FillAndExpand"
      HorizontalOptions="FillAndExpand"
      RowSpacing="0"
      ColumnSpacing="0">

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

  <Grid.RowDefinitions>
    <RowDefinition Height="1"/>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="1"/>
  </Grid.RowDefinitions>

  <BoxView BackgroundColor="Black"
           HeightRequest="1"
           HorizontalOptions="FillAndExpand"
           Grid.Row="0"/>

  <Grid VerticalOptions="Start"
        ColumnSpacing="0"
        Grid.Row="1">

    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*"/>
      <ColumnDefinition Width="1"/>
      <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <Button Text="Button 1"/>

    <BoxView BackgroundColor="Black"
             WidthRequest="1"
             VerticalOptions="FillAndExpand"
             Grid.Column="1"/>

    <Button Text="Button 1"
            Grid.Column="2"/>
  </Grid>

  <BoxView BackgroundColor="Black"
           HeightRequest="1"
           HorizontalOptions="FillAndExpand"
           Grid.Row="2"/>
</Grid>
  <Grid BackgroundColor="White" >
        <BoxView BackgroundColor="Pink"  />
        <Grid BackgroundColor="White" Margin="5">

        </Grid>
    </Grid>