I’ve managed to reduce this to a simple test case. An exception is thrown during the parsing of this XAML using XamlReader.Parse():
<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="True" />
</DockPanel>
The exception message is:
Cannot set unknown member ‘System.Windows.Controls.TextBox.IsReadOnly’. Line number ’13’ and line position ’11’.
If I don’t set IsReadOnly on the TextBox, it parses fine. It also parses fine if I remove the style trigger.
Can anyone shed some light on this? I’m rather new to WPF.
UPDATE:
Here’s the unit test I’m using to reproduce this (it’s failing on my PC):
[TestMethod]
public void TestIsReadOnlyOnTextBox()
{
// Arrange
var xaml =
@"<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=""True"" />
</DockPanel>
";
// Act
try {
var root = XamlReader.Parse(xaml);
}
catch (XamlParseException ex) {
Assert.Fail(ex.Message);
}
// If we get here, test passes
}
UPDATE 2:
I was originally referencing just PresentationFramework v4.0.30319. Adding references to PresentationCore, System.Xaml, and WindowsBase has no effect.
.NET version of project is 4 (full, not client profile).
UPDATE 3:
Arg, this works fine in ExpressionBlend 3.0.1927.0 and XamlPadX 4. As reported by AresAvatar, it seems to only fail when parsed with XamlReader.Parse() or XamlReader.Load()!
Short answer, clearly this is a bug. The following can be used as a workaround.
Update, workaround 2
Even just executing the following line before
XamlReader.Parse(xaml)fixes the problem, still clueless as to why though..Workaround 1
Using Boolean in mscorlib instead of True in the
Triggerseems to fix the problem for good. The following xaml does not throw an exception inXamlReader.ParseSome research details..
I did some testing of this weird problem.
First I included the working
DockPanelin Xaml and saved it withjust to see if that piece of xaml was working with
XamlReader.Parse, and it did.Then I made small changes to the generated xaml (and reverted once the exception came back) until I got as close as possible to the original. The weird part is that once this xaml has been parsed, the original works as well.
The part that made it working seems to be using
<s:Boolean>True</s:Boolean>instead ofTrue.I’ll update again if I find something more on this..