如何验证用户提供的自定义 XAML 中的属性值?

How can I validate an attribute value in custom XAML supplied by the user?

我的应用程序允许用户将一些自定义 XAML 标记放入文本框中。当我的应用程序加载时,我使用 XamlReader.Parse 来加载树。然后我用这些自定义资源覆盖我的 MergedDictionaries 中的一些资源。

这很有效,当用户输入无效 Xaml 时,我可以捕获 XamlParseException。当用户键入不正确的属性值(如边框颜色)时,问题就来了。如果他们输入 Gray 而不是 Gray,则没有例外,UI 只是无法显示。事实上,应用程序似乎已冻结。

这个问题也可以在 VS 设计器中重现。只需输入不正确的颜色值(忽略 Intellisense)。 VS中不会有警告。

有什么方法可以捕捉到这个不正确的属性值吗?

如果您使用 XamlReader(通常)加载 DataTemplates - DataTemplate 内部的 xaml 在第一次使用模板之前不会被解析(当然,xml 验证仍然会执行)。所以要处理这个问题,你可以这样做:

var dt = (DataTemplate)XamlReader.Parse("<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><TextBox Background=\"Gray\" /></DataTemplate>"); // < template with invalid color
try {
    dt.LoadContent(); // this will parse template content
}
catch (XamlParseException ex) {
    // notify user xaml is invalid             
}