尝试设置TextBox.IsReadOnly时出现奇怪的XAML解析错误
我已经设法将其简化为一个简单的测试用例。 使用XamlReader.Parse()
解析此XAML期间抛出exception:
exception消息是:
无法设置未知成员’System.Windows.Controls.TextBox.IsReadOnly’。 行号“13”和行位置“11”。
如果我没有在TextBox
上设置IsReadOnly
,它会解析得很好。 如果我删除样式触发器,它也会解析。
任何人都可以对此有所了解吗? 我对WPF很新。
更新:
这是我用来重现这个的unit testing(它在我的电脑上失败了):
[TestMethod] public void TestIsReadOnlyOnTextBox() { // Arrange var xaml = @" "; // Act try { var root = XamlReader.Parse(xaml); } catch (XamlParseException ex) { Assert.Fail(ex.Message); } // If we get here, test passes }
更新2:
我最初只引用了PresentationFramework v4.0.30319。 添加对PresentationCore,System.Xaml和WindowsBase的引用无效。
.NET版本的项目是4(完整,而不是客户端配置文件)。
更新3:
Arg,这在ExpressionBlend 3.0.1927.0和XamlPadX 4中工作得很好。正如AresAvatar报道的那样,在使用XamlReader.Parse()
或XamlReader.Load()
进行解析时似乎只会失败!
简短的回答,显然这是一个错误。 以下内容可用作解决方法。
更新,解决方法2
即使只是在XamlReader.Parse(xaml)
之前执行以下行修复了问题,仍然无法解释为什么虽然..
XamlReader.Parse(@" "); var root = XamlReader.Parse(xaml);
解决方法1
在Trigger
使用mscorlib中的布尔而不是True似乎可以很好地解决问题。 以下xaml不会在XamlReader.Parse
引发exception
var xaml = @" True ";
一些研究细节……
我对这个奇怪的问题做了一些测试。
首先,我在Xaml中包含了工作的DockPanel
并将其保存
string xaml = XamlWriter.Save(theDockPanel);
只是为了看看那片xaml是否正在使用XamlReader.Parse
,它确实如此。
然后我对生成的xaml进行了小的更改(并在exception恢复后恢复),直到我尽可能接近原始xaml。 奇怪的是,一旦解析了这个xaml,原始版本也可以工作。
使其工作的部分似乎是使用
而不是True
。
var modifiedXaml = @" True "; var originalXaml = @" "; try { // If this line is executed, no `XamlParseException` is thrown var root = XamlReader.Parse(modifiedXaml); var root2 = XamlReader.Parse(originalXaml); } catch (XamlParseException ex) { }
如果我发现更多内容,我会再次更新..
我的一位客户在一次安装中遇到过这种情况 – 我自己无法重复。
在我的实例中, Text
属性绑定到底层视图模型的字符串属性,并且在xaml中IsReadOnly
属性设置为“True”,如Cameron的第一个示例中所示。
通过将绑定到Text
属性的模式更改为OneWay来解决该问题。
我使用隐式样式使用Telerik UI for WPF 2017.2在WPF应用程序上遇到此问题。
我在这里发布这个,因为其他人很可能会在查找错误消息时遇到此问题:
无法设置未知成员’System.Windows.Controls.TextBox.IsReadOnly’
通常,隐式样式XAML使用“资源”的构建操作进行配置,如果将其更改为构建操作“页面”,则所有Telerik控件都会正确显示。
来源: Telerik反馈页面
到目前为止,我只需要更改Telerik.Windows.Controls.Input.xaml上的构建操作,但您的里程可能会有所不同。 至少你不必像我那样改变隐式样式。
PS:我希望这个解决方法可以解决任何有类似问题的人,或者试图调查.NET XamlReader上的明显错误
XamlParser不会自动加载额外的程序集,例如System.Windows.Interactivity,这是定义触发器的位置。 在解析Xanl之前,尝试在代码中声明来自该程序集的虚拟变量。 或者,使用Assembly.Load加载程序集。