gpt4 book ai didi

c# - 将 XamlReader 用于没有默认构造函数的控件

转载 作者:行者123 更新时间:2023-11-30 16:34:46 25 4
gpt4 key购买 nike

我有一些 Xaml 对象的字符串表示形式,我想构建控件。我正在使用 XamlReader.Parse功能来做到这一点。对于一个简单的控件,例如 Button,它有一个不带任何参数的默认构造函数,这工作正常:

var buttonStr = "<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">Text</Button>";
var button = (Button)XamlReader.Parse(buttonStr);

但是,当我尝试这样做时,例如a Stroke 控制失败。首先尝试一个简单的空 Stroke:

var strokeStr = "<Stroke xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"></Stroke>";
var stroke = (Stroke)XamlReader.Parse(strokeStr);

这给出了错误:

Cannot create object of type 'System.Windows.Ink.Stroke'. CreateInstance failed, which can be caused by not having a public default constructor for 'System.Windows.Ink.Stroke'.

在 Stroke 的定义中,我看到它至少需要构造一个 StylusPointsCollection。我假设这就是错误告诉我的内容,尽管有点假设这将由 XamlReader 处理。尝试使用其中的 StylusPoints 转换 Stroke 的 Xaml 会产生相同的错误:

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 如何正确创建 Stroke?

最佳答案

它是 XAML 语言的一个“特性”,它是声明性的,对构造函数一无所知。

人们使用 ObjectDataProvider在 XAML 中“翻译”并包装没有无参数构造函数的类的实例(它是 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.

关于c# - 将 XamlReader 用于没有默认构造函数的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2335900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com