Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试设置TextBox.IsReadOnly时出现奇怪的XAML分析错误_C#_Wpf_Xaml_Xamlreader - Fatal编程技术网

C# 尝试设置TextBox.IsReadOnly时出现奇怪的XAML分析错误

C# 尝试设置TextBox.IsReadOnly时出现奇怪的XAML分析错误,c#,wpf,xaml,xamlreader,C#,Wpf,Xaml,Xamlreader,我已经设法将其简化为一个简单的测试用例。使用XamlReader.Parse()解析此XAML时引发异常: 更新2: 我最初只是引用PresentationFramework v4.0.30319。添加对PresentationCore、System.Xaml和WindowsBase的引用无效 project的.NET版本为4(完整,而不是客户端配置文件) 更新3: Arg,这在ExpressionBlend 3.0.1927.0和XamlPadX 4中运行良好。正如AresAvatar所报告的

我已经设法将其简化为一个简单的测试用例。使用
XamlReader.Parse()
解析此XAML时引发异常:

更新2:
我最初只是引用PresentationFramework v4.0.30319。添加对PresentationCore、System.Xaml和WindowsBase的引用无效

project的.NET版本为4(完整,而不是客户端配置文件)

更新3:

Arg,这在ExpressionBlend 3.0.1927.0和XamlPadX 4中运行良好。正如AresAvatar所报告的,它似乎只有在使用
XamlReader.Parse()
XamlReader.Load()解析时才会失败

XamlParser不会自动加载额外的程序集,例如System.Windows.Interactivity,这是定义触发器的地方。在解析Xanl之前,尝试在代码中声明来自该程序集的伪变量。或者,使用Assembly.Load加载程序集。

简短回答,显然这是一个bug。以下内容可用作变通方法

更新,解决方案2

即使只是在
XamlReader.Parse(xaml)
之前执行下面这行代码,也解决了这个问题,但仍然不知道为什么

XamlReader.Parse(@"<TextBox xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                            xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
                            IsReadOnly=""True""/>");
var root = XamlReader.Parse(xaml);

一些研究细节

我对这个奇怪的问题做了一些测试

首先,我在Xaml中包含了工作
DockPanel
,并用

string xaml = XamlWriter.Save(theDockPanel);
只是想看看这段xaml是否在使用
XamlReader.Parse
,它确实在使用

然后,我对生成的xaml做了一些小的更改(并在异常返回后恢复),直到尽可能接近原始的xaml。奇怪的是,一旦对这个xaml进行了解析,原始文件也可以正常工作

使其工作的部分似乎使用了
True
而不是
True

var modifiedXaml = @"<DockPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                                xmlns:s=""clr-namespace:System;assembly=mscorlib"" 
                                xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
                <DockPanel.Resources>
                    <s:Boolean x:Key=""BooleanTrue"">True</s:Boolean>
                    <Style TargetType=""TextBox"">
                        <Style.Triggers>
                            <Trigger Property=""IsReadOnly"" Value=""{StaticResource BooleanTrue}"">
                                <Setter Property=""Background"" Value=""#FFEEEEEE"" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DockPanel.Resources>
                <TextBox IsReadOnly=""True"" />
            </DockPanel>";

var originalXaml = @"<DockPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                                xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
                <DockPanel.Resources>
                    <Style TargetType=""TextBox"">
                        <Style.Triggers>
                            <Trigger Property=""IsReadOnly"" Value=""True"">
                                <Setter Property=""Background"" Value=""#FFEEEEEE"" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DockPanel.Resources>
                <TextBox IsReadOnly=""{Binding}""/>
            </DockPanel>";
try
{
    // If this line is executed, no `XamlParseException` is thrown
    var root = XamlReader.Parse(modifiedXaml);
    var root2 = XamlReader.Parse(originalXaml);
}
catch (XamlParseException ex)
{

}
var modifiedXaml=@”
真的
";
变量originalXaml=@”
";
尝试
{
//如果执行这一行,则不会抛出'XamlParseException'
var root=XamlReader.Parse(modifiedXaml);
var root2=XamlReader.Parse(originalXaml);
}
捕获(XamlParseException-ex)
{
}

如果我发现更多信息,我将再次更新。

我的一个客户在一次安装中遇到了这种情况-我自己无法重新编程。
在我的实例中,
Text
属性被绑定到基础视图模型的string属性,而
IsReadOnly
属性在xaml中被设置为“True”,就像Cameron的第一个示例一样。

通过将

Text
属性的绑定模式更改为单向,问题得以解决。

<TextBox Text="{Binding SomeProperty, Mode=OneWay}" IsReadOnly="True" />

我在使用Telerik UI for WPF 2017.2(使用隐式样式)的WPF应用程序上遇到了这个问题

我之所以在这里发布此消息,是因为其他人很可能会在查找错误消息时遇到此问题:

无法设置未知成员“System.Windows.Controls.TextBox.IsReadOnly”

通常,隐式样式XAML配置为“资源”的构建操作,如果将其更改为“页面”的构建操作,则所有Telerik控件都会正确显示

资料来源:

到目前为止,我只需要更改Telerik.Windows.Controls.Input.xaml上的构建操作,但您的里程可能会有所不同。至少你不必像我那样改变隐式风格


PS:我希望此解决方案能为任何有类似问题或试图调查.NET XamlReader上明显错误的人提供一些帮助

您的代码对我来说运行良好。尝试更改IsReadOnly by TextBox.IsReadOnly对我来说也运行良好。您使用的是什么版本的WPF?好的,我使用XamlReader.Parse的测试代码再现了您的问题。这在我看来像是微软的一个错误。@Cameron,我只在顶部尝试了Xaml,它很有效。是XamlReader,解析被破坏了。该异常具有来自XamlWriter的内部异常,但详细信息相同。我说向Microsoft报告它。我使用
var dummy=TriggerCollection尝试了您的建议。ShouldSerializeStoredWeakReference(null)(随机选择的方法)。还是一样的例外。我怀疑它通常不是触发器,因为如果我删除
TextBox
元素本身上的
IsReadOnly=“True”
属性,它的解析就很好了。这是
System.Windows.Interactivity
,顺便说一句,根据另一个答案,听起来可能是mscorlib没有及时加载。这听起来很奇怪,但是在解析调用之前声明一个布尔变量可能是值得的。我添加了一个伪布尔变量,但它没有改变行为。我很难相信代码可以在不加载mscorlib的情况下运行;-)根据另一个答案,以及在解决方法之后如何正确解析原始代码,似乎仍然没有正确加载“某物”。我描述的解决方法是解析包含Telerik RadChart的Xaml所必需的。不过我同意-mscorlib不加载似乎不太可能。真奇怪!谢谢你的解决方案,我明天会处理它,然后再给你回复。第二个解决方案很好,很短,只需要执行一次。不需要
x
名称空间,因此可以将其缩短为
XamlReader.Parse(“”)。谢谢这就是我遇到的。文本框绑定到只读属性,如果没有Mode=OneWay(或OneTime),它将生成运行时异常。
string xaml = XamlWriter.Save(theDockPanel);
var modifiedXaml = @"<DockPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                                xmlns:s=""clr-namespace:System;assembly=mscorlib"" 
                                xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
                <DockPanel.Resources>
                    <s:Boolean x:Key=""BooleanTrue"">True</s:Boolean>
                    <Style TargetType=""TextBox"">
                        <Style.Triggers>
                            <Trigger Property=""IsReadOnly"" Value=""{StaticResource BooleanTrue}"">
                                <Setter Property=""Background"" Value=""#FFEEEEEE"" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DockPanel.Resources>
                <TextBox IsReadOnly=""True"" />
            </DockPanel>";

var originalXaml = @"<DockPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                                xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
                <DockPanel.Resources>
                    <Style TargetType=""TextBox"">
                        <Style.Triggers>
                            <Trigger Property=""IsReadOnly"" Value=""True"">
                                <Setter Property=""Background"" Value=""#FFEEEEEE"" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DockPanel.Resources>
                <TextBox IsReadOnly=""{Binding}""/>
            </DockPanel>";
try
{
    // If this line is executed, no `XamlParseException` is thrown
    var root = XamlReader.Parse(modifiedXaml);
    var root2 = XamlReader.Parse(originalXaml);
}
catch (XamlParseException ex)
{

}
<TextBox Text="{Binding SomeProperty, Mode=OneWay}" IsReadOnly="True" />