以编程方式将网格宽度/高度设置为字符串,即:“auto”或“*”,“10”或“2 *”等,,,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以编程方式将网格宽度/高度设置为字符串,即:“auto”或“*”,“10”或“2 *”等,,,相关的知识,希望对你有一定的参考价值。

这是我正在尝试做的事情:

XAML:

<local:MegaGrid MegaCol="auto,auto,*,auto">
    <Button Grid.Column="0" Content="Btn1"/>
    <Button Grid.Column="1" Content="Btn2"/>
    <Button Grid.Column="2" Content="Btn3 Stretch"    
                            HorizontalAlignment="Stretch"/>
    <Button Grid.Column="3" Content="Btn2"/>
</local:MegaGrid>

C#:

//All the Normal using statements plus a few more...
using System.Text.RegularExpressions;

//Uncomment these two for WPF or comment out for UWP
//using System.Windows;
//using System.Windows.Controls;

namespace NameSpaceOfYourApp {
public class MegaGrid : Grid
{
    private string zMegaRow = "";

    public string MegaRow
    {
        get { return zMegaRow; }
        set
        {
            zMegaRow = value;
            RowDefinitions.Clear();

            string value2 = Regex.Replace(value, @"s+", "");
            string[] items = value2.Split(',');

            foreach (string item in items)
            {
                // QUESTION: HOW TO CONVERT ITEM
                // DIRECTLY FROM STRING INTO RowDefinition?
                // Without Parsing the string
                if (item == "*")
                {
                    RowDefinitions.Add(
                      new RowDefinition { 
                        Height = new GridLength(1, GridUnitType.Star) }
                    );
                }

                else if (item == "auto")
                {
                    RowDefinitions.Add(
                       new RowDefinition { Height = GridLength.Auto }
                    );
                }
            }
        }
    } // MegaRow

    private string zMegaCol = "";

    public string MegaCol
    {
        get { return zMegaCol; }
        set
        {
            zMegaRow = value;
            ColumnDefinitions.Clear();

            string value2 = Regex.Replace(value, @"s+", "");
            string[] items = value2.Split(',');

            foreach (string item in items)
            {
                // QUESTION: HOW TO CONVERT ITEM
                // DIRECTLY FROM STRING INTO ColumnDefinition?
                // Without Parsing the string
                if (item == "*")
                {
                    ColumnDefinitions.Add(
                      new ColumnDefinition { 
                        Width = new GridLength(1, GridUnitType.Star) }
                    );
                }

                else if (item == "auto")
                {
                    ColumnDefinitions.Add(
                       new ColumnDefinition { Width = GridLength.Auto }
                    );
                }
            }
        }
    } // MegaCol

} //MegaGrid
} //NameSpaceOfYourApp

我需要知道的是,如何调用XAML用于创建RowDefintions对象的相同String到RowDefinitions转换器。 ColumnDefinitions也是如此。除了从C#而不是从XAML调用它。我可以轻松编写if else语句和正则表达式来解析XAML将为RowDefinition和ColumnDefinitions接受的字符串。我只是试图使用已经内置到Grid组件中的函数,XAML在从字符串转换为这些对象时调用它们。

答案

XAML使用TypeConverters转换为字符串和从字符串转换。你可以得到TypeConverter(或任何其他类型)的GridLength,如下所示:

var converter = TypeDescriptor.GetConverter(typeof(GridLength));

然后你可以在你的foreach循环中使用TypeConverter.ConvertFromString方法,如下所示:

foreach (string item in items)
{
    ColumnDefinitions.Add(
        new ColumnDefinition { 
            Width = (GridLength)converter.ConvertFromString(item)
        }
    );
}

以上是针对您的列,行的代码看起来是一样的。

另一答案

Dave M的完整答案:

foreach (string item in items)
{
    GridLengthConverter converter = new GridLengthConverter();

    RowDefinitions.Add(
      new RowDefinition { 
        Height = (GridLength)converter.ConvertFromString(item) }
        );
}

以上答案适用于WPF。如果您正在使用UWP,那么您可以通过创建自己的GridLengthConverter类来使用上面的代码,因为此类没有UWP:

public class GridLengthConverter
{
    public GridLength ConvertFromString(string s)
    {
        if (s == "auto")
            return GridLength.Auto;
        else if (s == "*")
            return new GridLength(1, GridUnitType.Star);
        else
        {
            int pixels;
            int.TryParse(s, out pixels);
            var g = new GridLength(pixels);
            return g;
        }
    }
}

以上是关于以编程方式将网格宽度/高度设置为字符串,即:“auto”或“*”,“10”或“2 *”等,,,的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将UICollectionViewCell宽度设置为UICollectionView宽度

如何以编程方式将 Silverlight Grid 布局 ColumnDefinition 宽度设置为“*”?

xamarin.forms以编程方式将行高设置为0会导致不需要的空间

如何以编程方式将 UIImageView 缩放到固定宽度和灵活高度?

以编程方式创建网格视图

如何以编程方式在 UILabel 上设置 sizeToFit 宽度和高度?