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