我有一些Xaml对象的字符串表示,我想构建控件。我正在使用XamlReader.Parse函数来执行此操作。对于一个简单的控件,比如Button,默认构造函数不带任何参数,这可以正常工作:
var buttonStr = "<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">Text</Button>";
var button = (Button)XamlReader.Parse(buttonStr);
然而,当我尝试这样做时,例如一个中风控制它失败了。首先尝试一个简单的空笔画:
var strokeStr = "<Stroke xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"></Stroke>";
var stroke = (Stroke)XamlReader.Parse(strokeStr);
这给出了错误:
无法创建“System.Windows.Ink.Stroke”类型的对象。 CreateInstance失败,这可能是因为没有'System.Windows.Ink.Stroke'的公共默认构造函数。
在Stroke的定义中,我发现至少需要构造一个StylusPointsCollection。我假设这是错误告诉我的,虽然有点假设这将由XamlReader处理。尝试使用StylusPoints转换一个Xaml of Stroke会产生同样的错误:
var strokeStr =
"<Stroke xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" +
"<Stroke.StylusPoints>" +
"<StylusPoint X=\"100\" Y=\"100\" />" +
"<StylusPoint X=\"200\" Y=\"200\" />" +
"</Stroke.StylusPoints>" +
"</Stroke>";
var stroke = (Stroke) XamlReader.Parse(strokeStr);
我做错了什么?如何告诉XamlReader如何正确创建笔划?
答案 0 :(得分:3)
它是XAML语言的“特性”,它是声明性的,对构造函数一无所知。
人们在XAML中使用ObjectDataProvider来“翻译”并包装没有无参数构造函数的类的实例(它是also useful for data binding)。
在您的情况下,XAML应该看起来像这样:
<ObjectDataProvider ObjectType="Stroke">
<ObjectDataProvider.ConstructorParameters>
<StylusPointsCollection>
<StylusPoint X="100" Y="100"/>
<StylusPoint X="200" Y="200"/>
</StylusPointsCollection>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
代码应该是:
var stroke = (Stroke) ((ObjectDataProvider)XamlReader.Parse(xamlStr)).Data;
HTH。