尝试设置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而不是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加载程序集。