【问题标题】:How to set auto fill to grid column width如何将自动填充设置为网格列宽
【发布时间】:2018-12-07 09:57:53
【问题描述】:

我有一个只有一行高度为 GridLength.Star 的网格。 在第一列中,我有一个填充单元格的 svg。 在第二列中,我有一个标签。

svg 是一个正方形,应该在垂直和水平方向上填充它,但不能更多。 标签应占宽度的其余部分。

我试着设置

column1.Width = GridLength.Auto;
column2.Width = GridLength.Star;

但总会在中间分开。

所以我得到了:

svg........|标签........

而不是(我想要的):

svg|标签........

有什么想法吗?

更新

Label label = new Label();

SvgCachedImage svgImage = new SvgCachedImage();
svgImage.HorizontalOptions = LayoutOptions.CenterAndExpand;
svgImage.VerticalOptions = LayoutOptions.CenterAndExpand;

Grid grid = new Grid();
grid.Children.Add( svgImage );
grid.Children.Add( label );

RowDefinition row = new RowDefinition();
ColumnDefinition column1 = new ColumnDefinition();
ColumnDefinition column2 = new ColumnDefinition();

row.Height = GridLength.Star;
grid.RowDefinitions = new RowDefinitionCollection { row1 };
column1.Width = GridLength.Auto;
column2.Width = GridLength.Star;
grid.ColumnDefinitions = new ColumnDefinitionCollection { column1, column2 };

更新 2

抱歉,它不是 Fill,而是 CenterAndExpand

【问题讨论】:

  • 您的 SVG 有多大?占满一半吗?
  • svg 的大小无关紧要,因为它总是填充第一个单元格,因此它会修改其大小。
  • 您能展示一下您当前的网格设置 (XAML/C#) 吗?

标签: xamarin xamarin.forms grid


【解决方案1】:

我得到了答案。我只需要将 svg 的高度设置为其 widthRequest:

 svgImage.WidthRequest = svgImage.Height;
 column1.Width = GridLength.Auto;
 column2.Width = GridLength.Star;
 grid.Children.Add( svgImage, 0, 0 );
 grid.Children.Add( label, 1, 0 );

【讨论】:

    【解决方案2】:

    嗯,实际上它非常简单,其背后的原因是 GridLength.Auto 你有所有你需要做的就是将 Grid 列定义更改为这样的:

    XAML

    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="1*"/> // svg
      <ColumnDefinition Width="4*"/> // label
    </Grid.CoulmnDefinitions>
    

    C#

    Grid grid= new Grid
    {
        ColumnDefinitions = 
                {
                   new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }, 
                   new RowDefinition { Height = new GridLength(4, GridUnitType.Star) },
                }
    }
    
    grid.Children.Add(svgImage, 0, 0);
    grid.Children.Add(label, 0, 1);
    

    【讨论】:

    • 感谢您的回复。我已经尝试过了,但它并没有解决我的问题,因为当我的第一列的宽度变小时我的 svg 越来越小。
    • 您希望 svg 覆盖多少百分比的宽度
    • 我不想设置百分比。我想完全适合。否则可以取单元格的高度。但是这个高度设置为“*”,这对于宽度来说是不正确的。
    • 好的,那么在这种情况下,您正在以相反的方式进行操作,您应该这样做 column2.Width = GridLength.Auto; column1.Width = GridLength.Star;
    • Auto 不会占用它需要的空间并为可能的空间加星标吗?不幸的是,这并不能解决我的问题。情况变得更糟了。
    【解决方案3】:

    移动:

    grid.Children.Add( svgImage );
    grid.Children.Add( label );
    

    设置好行/列定义后,更改为:

    grid.Children.Add(svgImage, 0, 0);
    grid.Children.Add(label, 0, 1);
    

    您基本上必须告诉网格放置元素的行/列。通过在初始化列定义之前将它们添加到网格中,ColumnDefinitions 已默认为 GridLength.Star


    我已经整理了您的代码。请注意,我已经更改了 Height 的分配。

    Label label = new Label()
    {
       Text = "Some text" // Just some placeholder text
    };
    
    SvgCachedImage svgImage = new SvgCachedImage()
    {
        HorizontalOptions = LayoutOptions.CenterAndExpand,
        VerticalOptions = LayoutOptions.CenterAndExpand
    };
    
    Grid grid = new Grid();
    
    // NOTE: use GridLength class to set the Height/Width of rows/columns
    RowDefinition row = new RowDefinition()
    {
        Height = new GridLength(1, GridUnitType.Star)
    }
    ColumnDefinition column1 = new ColumnDefinition()
    {
        Width = new GridLength(1, GridUnitType.Auto)
    }
    ColumnDefinition column2 = new ColumnDefinition()
    {
        Width = new GridLength(1, GridUnitType.Star)
    }
    
    // Use existing instances of the definitions
    grid.RowDefinitions.Add(row1);
    grid.ColumnDefinitions.Add(column1);
    grid.ColumnDefinitions.Add(column2);
    
    grid.Children.Add(svgImage, 0, 0);
    grid.Children.Add(label, 1, 0);
    

    当我输入此内容时,我注意到您只是将Width 属性设置为GridLength.Star/Auto。根据docs,您应该使用GridLength ,而不是枚举。

    【讨论】:

    • 感谢您的回复,但该事件并没有改变任何事情,因为列定义仍然相同。
    • 我整理了你的代码,注意到你使用GridLength 作为枚举。这应该是一个。请参阅我修改后的答案。
    • 这完全一样(检查 xamarin 代码注释)
    • 你说得对(我个人喜欢直言不讳)。我刚刚更改了孩子的顺序,应该是Add(View, Column, Row)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2012-05-01
    • 2011-05-31
    • 1970-01-01
    • 2013-12-04
    • 2011-11-01
    相关资源
    最近更新 更多