将XamlReader用于没有默认构造函数的控件
我有一些Xaml对象的字符串表示,我想构建控件。 我正在使用XamlReader.Parse函数来执行此操作。 对于一个简单的控件,比如Button,默认构造函数不带任何参数,这个工作正常:
var buttonStr = ""; var button = (Button)XamlReader.Parse(buttonStr);
但是,当我尝试对例如Stroke控件执行此操作时,它会失败。 首先尝试一个简单的空笔画:
var strokeStr = ""; var stroke = (Stroke)XamlReader.Parse(strokeStr);
这给出了错误:
无法创建“System.Windows.Ink.Stroke”类型的对象。 CreateInstance失败,这可能是因为没有’System.Windows.Ink.Stroke’的公共默认构造函数。
在Stroke的定义中,我发现它至少需要构造一个StylusPointsCollection。 我假设这是错误告诉我的,虽然有点假设这将由XamlReader处理。 尝试使用StylusPoints转换一个Xaml of Stroke会产生同样的错误:
var strokeStr = "" + "" + "" + "" + "" + ""; var stroke = (Stroke) XamlReader.Parse(strokeStr);
我究竟做错了什么? 如何告诉XamlReader如何正确创建笔划?
它是XAML语言的“特性”,它是声明性的,对构造函数一无所知。
人们在XAML中使用ObjectDataProvider来“翻译”并包装没有无参数构造函数的类的实例(它对数据绑定也很有用 )。
在您的情况下,XAML应该看起来像这样:
代码应该是:
var stroke = (Stroke) ((ObjectDataProvider)XamlReader.Parse(xamlStr)).Data;
HTH。
- 在UserControls之间传递CheckBox值
- 如何打开Internet Explorer窗口,在URL上导航并使用c#和mshtml库获取她的文档(HTMLDocument或InternetExplorer)
- 如果将其名称作为参数传递,如何在方法中打开表单
- 如何在WPF中重新加载(重置)整个页面?
- 在触摸板上获取手指位置
- validationoracle数据库连接的一些棘手的快速方法
- System.Collections.Generic.List ‘不包含’equals’的定义
- 如何在C#中找到正确的用户名后单击数据网格中的按钮
- RNGCryptoServiceProvider – 更快地生成范围内的数字并保留分布?