Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式将网格宽度/高度设置为字符串,即;“自动”;或*&引用&引用;“10”;,或;2*";,等_C#_Wpf_Xaml_Uwp - Fatal编程技术网

C# 以编程方式将网格宽度/高度设置为字符串,即;“自动”;或*&引用&引用;“10”;,或;2*";,等

C# 以编程方式将网格宽度/高度设置为字符串,即;“自动”;或*&引用&引用;“10”;,或;2*";,等,c#,wpf,xaml,uwp,C#,Wpf,Xaml,Uwp,以下是我想做的: XAML: 我需要知道的是,如何调用XAML用于创建RowDefinitions对象的相同字符串到RowDefinitions转换器。列定义也是如此。除了从C#而不是从XAML调用它。我可以很容易地编写if-else语句和正则表达式来解析XAML将接受的RowDefinition和ColumnDefinition字符串。我只是尝试使用已经内置在网格组件中的函数,当从字符串转换为这些对象时,XAML会调用这些函数。XAML使用这些函数来转换字符串。您可以获得GridLength(

以下是我想做的:

XAML:

我需要知道的是,如何调用XAML用于创建RowDefinitions对象的相同字符串到RowDefinitions转换器。列定义也是如此。除了从C#而不是从XAML调用它。我可以很容易地编写if-else语句和正则表达式来解析XAML将接受的RowDefinition和ColumnDefinition字符串。我只是尝试使用已经内置在网格组件中的函数,当从字符串转换为这些对象时,XAML会调用这些函数。

XAML使用这些函数来转换字符串。您可以获得
GridLength
(或任何其他类型)的
TypeConverter
,如下所示:

var converter = TypeDescriptor.GetConverter(typeof(GridLength));
foreach (string item in items)
{
    ColumnDefinitions.Add(
        new ColumnDefinition { 
            Width = (GridLength)converter.ConvertFromString(item)
        }
    );
}
然后,您可以在foreach循环中使用
TypeConverter.ConvertFromString
方法,如下所示:

var converter = TypeDescriptor.GetConverter(typeof(GridLength));
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;
        }
    }
}

对不起…刚刚修好了。。。这是DependencyProperty的propertyLook我使用的是常规属性,因为我不需要为“MegaRow”属性使用{binding xxx}。。。我可以将XAML设置为常量字符串。。。DependencyProperty是您将字符串转换为RowDefinition的方式吗?旁注:最好对这种类型的东西使用attached属性,而不是创建自定义网格。这正是我想要的!谢谢。另外,需要添加:GridLengthConverter=new GridLengthConverter()。。。Width=(GridLength)converter.ConvertFromString(item)不,它已经在那里了,(第一个代码示例)我只是在它和foreach循环示例之间放了一些解释性的文字(b/c我认为,重要的是让答案解释实际发生了什么,而不仅仅是一堆代码)。最好在foreach循环之外进行,而不是在回答中每次通过循环都创建一个新实例。。。你知道如何在UWP中做到这一点吗?新建GridLengthConverter().ConvertFromString(项)。。似乎他们从UWP中移除了GridLengthConverter。。对不起,没有UWP的经验