如何验证用户提供的自定义 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
}
我的应用程序允许用户将一些自定义 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
}